泛型 - 使用父类指定泛型中的类型

时间:2013-08-13 11:56:27

标签: c# generics

我正在研究一些协方差/逆变问题,我有一个更广泛的问题,但这一切归结为:

GenericRepository<BaseEntity> repo = new GenericRepository<ProductStyle>(context);

这不起作用,即使BaseEntity是ProductStyle的父抽象类,有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:6)

执行此操作的唯一方法是使用out通用限制(这样可以很难保存对象,但很难检索它们),在 interface 上(不是class)。如果你有:

interface IGenericRepository<out T> {...}

然后可以将IGenericRepository<ProductStyle>分配给IGenericRepository<BaseEntity>类型的变量,因为所有ProductStyle也是BaseEntity,我们将自己限制为协变/ {{1用法:

out

但请注意,这种协变/ IGenericRepository<BaseEntity> tmp = GetRepo<ProductStyle>(context); // note that the right-hand-side returns IGenericRepository<ProductStyle> ... private IGenericRepository<T> GetRepo(...) {...} 用法使得无法执行以下操作:

out

答案 1 :(得分:0)

我只是想知道这样的事情是否也会有用 - 使用对GenericRepository定义的限制来限制T可以的基本类型:

void Main()
{
    var repo = new GenericRepository<ProductStyle>(new ProductStyle());
    Console.WriteLine(repo.ToString());  //just output something to make sure it works...
}

// Define other methods and classes here
public class GenericRepository<T> where T : BaseEntity {
    private readonly T _inst;

    public GenericRepository(T inst){
        _inst = inst;
        _inst.DoSomething();
    }
}

public class BaseEntity {
    public Int32 Id {get;set;}

    public virtual void DoSomething() { Console.WriteLine("Hello"); }
}

public class ProductStyle : BaseEntity {
}

因此,如果您使用GetRepo<T>方法,该方法可以返回T的GenericRepository,并确保TBaseEntity的子项。