在我的一个课程中,我有以下属性:
public List<ClassP> MyPlanes { get; set; }
在另一种方法中,我有一个上面属性的propertyInfo
(函数self不知道propertyinfo来自哪里)。现在,当我只拥有create a list of classP
的propertyInfo时,我正试图MyPlanes
。到目前为止,我的尝试似乎都是徒劳的,这就是我得到的声明:
变量prop是MyPlanes的PropertyInfo
public void GenerateList(PropertyInfo prop)
{
if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericArguments().Length > 0)
{
List<prop.PropertyType.GetGenericArguments().First()> myValueList =
new List<prop.PropertyType.GetGenericArguments().First()>();
}
}
创建列表(使用上面的代码)会出现以下错误Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments
非常感谢任何帮助
注意:我希望列表以上面显示的语法(或类似语法)创建。我希望尽可能保持我的代码通用
答案 0 :(得分:3)
要在具有类型时创建泛型类,不能使用括号<>
,因为您在编译时不知道类型。你需要做这样的事情:
var baseType = typeof(List<>);
var genericType = baseType.MakeGenericType(prop.PropertyType.GetGenericArguments().First());
现在您拥有正确的类型,您可以像这样创建它:
IList myList = (IList)Activator.CreateInstance(genericType);
编辑:虽然正如Selman22上面所说,你已经拥有PropertyType
,所以你不需要获得泛型类型,除非你试图用相同的泛型参数创建一个不同的泛型类(比如说你)拥有List<T>
并需要制作Dictionary<Type,T>
或其他内容。所以我会留下我的答案,以防你遇到这种情况。
答案 1 :(得分:2)
不幸的是,它不能像那样工作。你需要使用Reflection
来创建一个新实例:
var list = (List<ClassP>)Activator.CreateInstance(prop.PropertyType);
CreateInstance
方法返回object
。如果您在编译时不知道类型,则无法进行转换。最好的办法是使用dynamic
。这样你就可以访问任何成员而没有任何编译时错误,但显然它不安全。
您应该重新考虑一下真的是否需要在此使用Reflection
。如果您的问题可以在不使用Reflection
的情况下解决,那么您应该采用这种方式。