从PropertyInfo </type>创建通用列表<type>

时间:2015-01-20 13:58:35

标签: c# list generics

在我的一个课程中,我有以下属性:

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

非常感谢任何帮助

注意:我希望列表以上面显示的语法(或类似语法)创建。我希望尽可能保持我的代码通用

2 个答案:

答案 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的情况下解决,那么您应该采用这种方式。