关于c#:扩展方法不适用于接口

关于c#:扩展方法不适用于接口

Extension Methods not working for an interface

受MVC店面的启发,我正在从事的最新项目是使用IQueryable上的扩展方法来过滤结果。

我有这个界面;

1
2
3
4
IPrimaryKey
{
  int ID { get; }
}

我有这个扩展方法

1
2
3
4
public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
    return source(obj => obj.ID == id);
}

假设我有一个实现IPrimaryKey的类SimpleObj。 当我有一个SimpleObj的IQueryable时,除非我明确地将其转换为IPrimaryKey的IQueryable,否则不存在GetByID方法,这不理想。

我在这里想念什么吗?


只要正确完成,它就会起作用。 cfeduke的解决方案有效。 但是,您不必使IPrimaryKey接口具有通用性,实际上,您根本不必更改原始定义:

1
2
3
4
public static IPrimaryKey GetByID< T >(this IQueryable< T > source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}


编辑:Konrad的解决方案更好,因为它更简单。 以下解决方案有效,但仅在类似于ObjectDataSource的情况下才需要,在ObjectDataSource中,通过反射检索类的方法而无需沿袭继承层次结构。 显然,这不是在这里发生。

这是可能的,当我设计用于与ObjectDataSource一起使用的自定义实体框架解决方案时,我不得不实现类似的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface IPrimaryKey< T > where T : IPrimaryKey< T >
{
    int Id { get; }
}

public static class IPrimaryKeyTExtension
{
     public static IPrimaryKey< T > GetById< T >(this IQueryable< T > source, int id) where T : IPrimaryKey< T >
     {
         return source.Where(pk => pk.Id == id).SingleOrDefault();
     }
}

public class Person : IPrimaryKey<Person>
{
    public int Id { get; set; }
}

使用摘要:

1
2
3
4
5
6
7
8
var people = new List<Person>
{
    new Person { Id = 1 },
    new Person { Id = 2 },
    new Person { Id = 3 }
};

var personOne = people.AsQueryable().GetById(1);

由于泛型没有遵循继承模式的能力,因此无法使用。 即。 IQueryable 不在IQueryable 的继承树中


推荐阅读

    linux命令查看接口?

    linux命令查看接口?,系统,设备,地址,网络,信息,电脑,软件,情况,命令,灵活,lin

    linux转图像界面命令?

    linux转图像界面命令?,系统,密码,电脑,工具,地方,界面,图形界面,软件,终端,

    linux扩展文件命令?

    linux扩展文件命令?,工作,地址,系统,信息,命令,目录,管理,情况,文件,标准,Lin

    linux界面网络命令?

    linux界面网络命令?,网络,工作,地址,系统,信息,命令,目录,管理,标准,状态,使

    linux命令行界面向上?

    linux命令行界面向上?,系统,标准,工作,地址,环境,命令,管理,服务,较大,位置,l

    linux炫酷命令界面?

    linux炫酷命令界面?,系统,环境,项目,在线,网络,基础知识,网上,网站,近几年,

    linux打包项目命令?

    linux打包项目命令?,项目,文件,命令,软件,数字,系统,名称,工具,目录,格式,Lin

    linux项目更新命令行?

    linux项目更新命令行?,工作,地址,系统,数据,信息,项目,标准,电脑,目录,命令,l

    linux命令界面输入法?

    linux命令界面输入法?,系统,工具,信息,第三,软件,输入法,名字,盘后,语言,区

    linux更改扩展命令?

    linux更改扩展命令?,管理,地址,数据,工作,系统,在线,工具,命令,环境,单位,Lin

    linux转为命令界面?

    linux转为命令界面?,系统,密码,电脑,软件,界面,图形界面,控制台,终端,命令,

    linux命令行界面汉化?

    linux命令行界面汉化?,系统,标准,软件,网上,管理,工具,电脑,底部,服务,项目,x

    linux界面输入命令?

    linux界面输入命令?,工作,系统,信息,地址,平台,软件,位置,环境,盘中,设计,lin

    linux命令行界面翻页?

    linux命令行界面翻页?,工具,系统,命令,占比,技术,进程,空格键,模式,文件,字

    linux命令界面切换?

    linux命令界面切换?,密码,系统,终端,信息,状态,环境,地方,电脑,工具,命令,lin

    linux命令行交互界面?

    linux命令行交互界面?,系统,密码,状态,终端,信息,工具,环境,情况,首页,界面,l

    linux查看扩展名命令?

    linux查看扩展名命令?,工作,系统,地址,信息,软件,文件,标准,电脑,命令,目录,L

    linux命令行界面密码?

    linux命令行界面密码?,密码,系统,管理,状态,代码,软件,地址,信息,标的,用户,

    linux命令界面缩小?

    linux命令界面缩小?,系统,工具,网站,数字,等级,地址,缩放,信息,统一,异常,lin

    linux进命令行界面?

    linux进命令行界面?,系统,工具,首页,密码,终端,界面,命令,快捷键,窗口,桌面,l