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));
}
更新:我在想创建一个通用对象并调用泛型方法会使用相同的方法,但我想我错了。我怎样才能调用泛型方法?
答案 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]