【问题标题】:generic extension method通用扩展方法
【发布时间】:2009-05-07 16:52:59
【问题描述】:

我正在按照 Rob Connery 的店面视频系列开发这个 mvc 项目并应用这些技术。 关于过滤和扩展方法,我开始重复自己很多,例如:

public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}

public static Keyword WithID(this IQueryable<Keyword>qry,int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}
....

为了防止这种情况,我尝试编写这样的通用扩展:

public static T WithID<T>(this IQueryable<T>qry,int ID)
{
    return qry.SingleOrDefault(s=>ID==ID);
}

然而 s 没有 ID,那么你将如何解决这个问题?

【问题讨论】:

    标签: methods generics


    【解决方案1】:

    您需要一个声明 ID 属性的接口,例如

    public interface IInt32Identifiable
    {
        public int ID { get; }
    }
    

    然后你可以写:

    public static T WithID<T>(this IQueryable<T> source, int id)
        where T : IInt32Identifiable
    {
       return source.SingleOrDefault(s=> s.ID == id);
    }
    

    当然,您必须让所有适当的类都实现该接口——但这通常很容易;如果这些类是设计器生成的,您可能希望使用部分类。

    【讨论】:

      【解决方案2】:

      您需要两种不同的扩展方法。一种用于具有 ID 的类型,另一种用于没有 ID 的类型。您还需要一个所有 ID 类型都实现的接口或抽象基类。否则,编译器不会让你取消引用 ID。

      我能想到的唯一其他选择是需要反射来查询 ID 属性的类型,如果存在,则获取值。

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2011-07-27
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多