2012-03-08 50 views
1

假设我有一个方法使用字符串

public void Whatever<T>() { ... } 

假设我有一个字符串

var myType = "System.String"; 

通常形式的类型,我会打电话等方法指定的通用类型参数:

Whatever<string>(); 

但我想能够以某种方式使用myType来调用它。这可能吗? 我知道这是不行的,但概念:

Whatever<Type.GetType(myType)>(); 
+0

不是真的。泛型是一个编译时功能,使用类型元数据是一个运行时的事情。沿着这条道路的任何答案都可能是痛苦的。你真的需要做什么?因为也许有一个更简单的机制。 – 2012-03-08 15:02:17

+0

你打算如何继续使用'Whatever'? – dasblinkenlight 2012-03-08 15:04:22

+0

也许这个问题应该被编辑为“使用字符串指定泛型类型参数”,因为它可以用字符串表示泛型类型。 – Ani 2012-03-08 15:14:57

回答

0

您可以创建通过反射实例(或提供通用和非通用Whatever型)。当然,反射速度很慢(并且只能有一个对象或基类参考)。泛型类型通常可以只是非泛型类型的一个特例。

2

您可以使用反射和MethodInfo.MakeGenericMethod这个

反映您要拨打得到MethodInfo,然后使它通用和Invoke它的方法。

像这样(注意,这是从我的头(无VS这里)的顶部,它可能不是很完美,但应该让你开始):

Type type = myObject.GetType(); 
MethodInfo method = type.GetMethod("NameOfMethod"); 
MethodInfo genericMethod = method.MakeGenericMethod(typeOf(string)); 
genericMethod.Invoke(myObject, new object[] { "theString" }); 
+0

这可能工作(像你一样,我没有尝试过)。但我真的不想使用反思。 – Fernando 2012-03-08 15:16:55

+0

然后不行,'T'的类型只在运行时可用,所以你不能对它进行编码,并期望编译器明白你的意思。 :) – Bazzz 2012-03-08 15:22:56