C# 泛型类型实例的方法在';s类型参数未知?

C# 泛型类型实例的方法在';s类型参数未知?,c#,generics,C#,Generics,这似乎是个基本问题,但我正在努力解决(可能是因为疲劳) 例如,如果我像这样创建存储库实例=> var repositoryType = typeof(Repository<>).MakeGenericType(entityType); // repository type==object :( var repository = ServiceLocator.Current.GetInstance(repositoryType); var repositoryType=typeof

这似乎是个基本问题,但我正在努力解决(可能是因为疲劳)

例如,如果我像这样创建存储库实例=>

var repositoryType = typeof(Repository<>).MakeGenericType(entityType);
// repository type==object :(
var repository = ServiceLocator.Current.GetInstance(repositoryType); 
var repositoryType=typeof(Repository);
//存储库类型==对象:(
var repository=ServiceLocator.Current.GetInstance(repositoryType);

调用
repository.All()
方法的最佳方法是什么?反射是唯一的方法吗?

在.Net 3.5中,如果没有反射或更糟的方法,就不可能做到这一点。

这取决于
repository
是否公开了一些非通用接口(如LINQ to SQL中的接口)。如果不是,则必须使用反射。如果是,则强制转换到非通用接口:

IRepository repository = (IRepository)ServiceLocator
    .Current.GetInstance(repositoryType); 
IList data = repository.All();

4,也可以考虑<代码>动态< /代码>:

dynamic repository = ServiceLocator.Current.GetInstance(repositoryType); 
IList data = repository.All();

你也在问如何使用反射吗?不。反射对于这样的任务来说并不难。在运行时使用System.Linq.Expressions构建方法会更糟糕。表达式的唯一真正竞争对手是ILGenerator…对我来说,表达式每次都赢;-小袋…现在我头痛。似乎是时候休息了。创建
非通用报告在构造函数中使用entityType作为参数的Toory
。看起来很尴尬,但比反射更好。我自己也会选择接口,但不管什么都可以。而且,反射和泛型并不是好朋友。我想知道-在.Net 4.0中的类型协方差是否可以解决这个问题(我还没有彻底检查过)除非你有一个接口,b:可以严格定义为“in”或“out”,c:有一个共同的引用类型祖先,等等。简言之:我认为这不是一个可能的选择。