如果类型参数未知,如何调用泛型类实例的方法?

时间:2009-12-28 23:56:45

标签: c# generics

这似乎是一个基本问题,但我正在努力(可能是因为疲倦)。

E.g。 - 如果我像这样创建存储库实例=>

var repositoryType = typeof(Repository<>).MakeGenericType(entityType);
// repository type==object :(
var repository = ServiceLocator.Current.GetInstance(repositoryType); 

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

2 个答案:

答案 0 :(得分:3)

取决于Repository<>是否公开了一些非泛型接口(如ITable与LINQ-to-SQL中的Table<T>相比)。如果没有,你必须使用反射。如果它 ,则转换为非通用接口:

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

在4.0中,您还可以考虑dynamic

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

答案 1 :(得分:1)

在.Net 3.5中,如果没有反思或更糟糕,就无法做到这一点。