通用类型与扩展方法

时间:2015-05-08 09:31:50

标签: c# .net oop generics extension-methods

我需要在两种技术之间进行比较:使用泛型类型和扩展类型。我不是指一般的比较,我的意思是在这种特殊情况下我需要为名为Where T: ClassA的类添加一些功能

  1. 使用通用类型

    使用泛型类型(ClassA)并实现泛型方法

  2. 使用扩展方法

    通过添加扩展程序

    来使用 public static class Helper { public static void MethodOne(this ClassA obj, ) { // } }
    Repository Pattern
  3. 我需要知道:

    • 与其他技术相比,每项技术有哪些优点?
    • 为什么Entity总是使用第一种技术?例如,在此implementation中,为什么我们不将扩展方法添加到全局类{{1}}?

1 个答案:

答案 0 :(得分:5)

这是完全不同的两件事。

您使用泛型来提供通用功能。对于存储库,这通常与"基础实体一起使用"包含所有实体实现的属性的类或接口,如ID

public interface IEntity
{
    int ID { get; set; }
}

public class Client : IEntity
{
    public int ID { get; set; }
    public string Name { get; set; }        
}

public class Repository<T> 
    where T : IEntity
{
    private readonly IQueryable<T> _collection;
    public Repository(IQueryable<T> collection)
    {
        _collection = collection;
    }

    public T FindByID(int id)
    {
        return _collection.First(e => e.ID == id);
    }
}

您也可以使用扩展方法执行此操作:

public static T FindByID(this IQueryable<T> collection, int id)
    where T : IEntity
{
    return collection.First(e => e.ID == id);
}

如果没有泛型,您必须为每种类型实现存储库或扩展方法。

为什么不在这种情况下使用扩展方法:通常只在不能扩展基类型时使用。使用存储库类,您可以将操作分组到一个逻辑类中。

另请参阅When do you use extension methods, ext. methods vs. inheritance?What is cool about generics, why use them?