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>()
是Session
types的静态方法)
如果Session
实际上是一个对象 ,则需要知道Linq
方法实际声明的位置,并将Session
作为参数传入:
typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) .Invoke(null, new object[] {Session});