如何使用System.Type变量调用泛型方法?

时间:2014-01-16 21:24:59

标签: c# string generics types

Type valueType = Type.GetType("int");
object value = new List<valueType>();

第一行编译好,但第二行没编。

如何创建通用列表(或调用泛型方法)

object value = foo<valueType>();

只有字符串表示类型?

我的最终目标实际上是取两个字符串“int”和“5(作为示例)并将值5赋给对象[并最终分配给userSettings]。但我有一个方法可以转换”5 “如果我可以告诉泛型方法它是基于字符串表示的int类型的实际值。

T StringToValue<T>(string s)
{
    return (T)Convert.ChangeType(s, typeof(T));
}

更新:我在想创建一个通用对象并调用泛型方法会使用相同的方法,但我想我错了。我怎样才能调用泛型方法?

3 个答案:

答案 0 :(得分:1)

Type.GetType("int")返回null。这是无效的,因为int只是C#语言中的关键字,相当于System.Int32类型。它对.NET CLR没有特殊意义,因此它在反射中无法使用。您可能意味着typeof(int)Type.GetType("System.Int32")(或者它并不重要,因为这只是一个例子)。

无论如何,一旦你拥有正确的Type,这就是你如何获得你的清单。关键是MakeGenericType

Type valueType = typeof(int);
object val = Activator.CreateInstance(typeof(List<>).MakeGenericType(valueType));
Console.WriteLine(val.GetType() == typeof(List<int>)); // "True" - it worked!

答案 1 :(得分:0)

试试这个:

Type valueType = Type.GetType("System.Int32");
Type listType = typeof(List<>).MakeGenericType(valueType);
IList list = (IList) Activator.CreateInstance(listType);

// now use Reflection to find the Parse() method on the valueType. This will not be possible for all types
string valueToAdd = "5";
MethodInfo parse = valueType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
object value = parse.Invoke(null, new object[] { valueToAdd });

list.Add(value);

答案 2 :(得分:0)

我将与杰弗里·里希特的书 CLR通过C#分享一个关于构建泛型类型的例子,这不是特定于问题的,而是有助于指导您找到合适的方式来做你想做的事情:

public static class Program {
     public static void Main() {
       // Get a reference to the generic type's type object
       Type openType = typeof(Dictionary<,>);
       // Close the generic type by using TKey=String, TValue=Int32
       Type closedType = openType.MakeGenericType(typeof(String), typeof(Int32));
      // Construct an instance of the closed type
      Object o = Activator.CreateInstance(closedType);
      // Prove it worked
      Console.WriteLine(o.GetType());
      }
 }

将显示:Dictionary`2 [System.String,System.Int32]