当我运行程序时,弹出一条错误消息,提示:对象引用未设置为methodinfo.invoke(data,null)中对象的实例。我想要的是在运行时创建一个动态的通用集合,具体取决于xml文件,它可以是list<classname>
,dictionary<string, classname>
,customgenericlist<T>
等。
下面是代码:使用列表作为测试主题。
data = InstantiateGeneric("System.Collections.Generic.List`1", "System.String");
anobj = Type.GetType("System.Collections.Generic.List`1").MakeGenericType(Type.GetType("System.String"));
MethodInfo mymethodinfo = anobj.GetMethod("Count");
Console.WriteLine(mymethodinfo.Invoke(data, null));
这是实例化所述数据类型的代码:
public object InstantiateGeneric(string namespaceName_className, string generic_namespaceName_className)
{
Type genericType = Type.GetType(namespaceName_className);
Type[] typeArgs = {Type.GetType(generic_namespaceName_className)};
Type obj = genericType.MakeGenericType(typeArgs);
return Activator.CreateInstance(obj);
}
最佳答案
Count
是属性,而不是方法:
var prop = anobj.GetProperty("Count");
Console.WriteLine(prop.GetValue(data, null));
但是,最好将其强制转换为非泛型
IList
:var data = (IList)InstantiateGeneric("System.Collections.Generic.List`1",
"System.String");
Console.WriteLine(data.Count);
我还建议使用
Type
而不是魔术字符串进行交谈:var itemType = typeof(string); // from somewhere, perhaps external
var listType = typeof(List<>).MakeGenericType(itemType);
var data = (IList)Activator.CreateInstance(listType);
Console.WriteLine(data.Count);
关于c# - 通过反射动态创建通用列表时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16582896/