C#使用System.Type作为通用参数

我有一个需要在数据库上查询的types(System.Type)的列表。

对于每种types,我需要调用下面的extensionmethod(这是LinqToNhibernate的一部分):

Session.Linq<MyType>() 

但是我没有MyType,但是我想用Type来代替。

我拥有的是:

 System.Type typeOne; 

但我不能执行以下操作:

 Session.Linq<typeOne>() 

我如何使用types作为通用参数?

你不能,直接。 generics的要点是提供编译时安全性,在编译时知道你感兴趣的types,并且可以处理这种types的实例。 在你的情况下,你只知道Type所以你不能得到任何编译时检查,你有任何对象是该types的实例。

你需要通过reflection调用方法 – 像这样:

 // Get the generic type definition MethodInfo method = typeof(Session).GetMethod("Linq", BindingFlags.Public | BindingFlags.Static); // Build a method with the specific type argument you're interested in method = method.MakeGenericMethod(typeOne); // The "null" is because it's a static method method.Invoke(null, arguments); 

如果您需要使用这种types,您可能会发现编写自己的通用方法会更方便,该通用方法会调用所需的其他所有通用方法,然后使用reflection调用您的方法。

要做到这一点,你需要使用reflection:

 typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null); 

(假设Linq<T>()Sessiontypes的静态方法)

如果Session实际上是一个对象 ,则需要知道Linq方法实际声明的位置,并将Session作为参数传入:

 typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) .Invoke(null, new object[] {Session});