如何使用给定的Type对象调用generics方法?
我想用给定的types对象调用generics方法。
void Foo(Type t) { MyGenericMethod<t>(); }
显然是行不通的。
我怎样才能使它工作?
您的代码示例将不起作用,因为generics方法需要一个types标识符,而不是Type类的一个实例。 你将不得不使用reflection来做到这一点:
public class Example { public void CallingTest() { MethodInfo method = typeof (Example).GetMethod("Test"); MethodInfo genericMethod = method.MakeGenericMethod(typeof (string)); genericMethod.Invoke(this, null); } public void Test<T>() { Console.WriteLine(typeof (T).Name); } }
请记住,这是非常脆弱的,我宁愿build议寻找另一种模式来调用你的方法。
另一个哈克解决scheme(也许有人可以使它更清洁)将使用一些expression魔术:
public class Example { public void CallingTest() { MethodInfo method = GetMethod<Example>(x => x.Test<object>()); MethodInfo genericMethod = method.MakeGenericMethod(typeof (string)); genericMethod.Invoke(this, null); } public static MethodInfo GetMethod<T>(Expression<Action<T>> expr) { return ((MethodCallExpression) expr.Body) .Method .GetGenericMethodDefinition(); } public void Test<T>() { Console.WriteLine(typeof (T).Name); } }
请注意在lambda中传递'object'types标识符作为genericstypes参数。 想不到如此快速如何解决这个问题。 无论哪种方式,我认为这是编译时安全的。 不知何故,它只是感觉错误:/
你需要使用reflection,不幸的是(由于Jared提到的原因)。 例如:
MethodInfo method = typeof(Foo).GetMethod("MyGenericMethod"); method = method.MakeGenericMethod(t); method.Invoke(this, new object[0]);
显然你会想要更多的错误检查在现实中:)
注意:我的本地MSDN没有指定MakeGenericMethod的参数是一个参数数组,所以我期望需要:
method = method.MakeGenericMethod(new Type[] { t });
但它似乎是现实中的一个参数数组,并且在线MSDN文档同意。 奇。
这种做法是行不通的。 Type是types的对象在运行时确定的原因。 但是你正试图用它来调用一个通用的方法。 generics方法调用的types是在编译时build立的。 因此,Type对象不能用于generics方法的types参数。