从 PropertyInfo 创建通用列表 <Type>

Create Generic List<Type> from PropertyInfo

在我的 类 之一中,我有以下 属性:

public List<ClassP> MyPlanes { get; set; }

在另一种方法中,我有上面 属性 的 propertyInfo(函数 self 不知道 属性info 来自哪里)。现在,当我只有 MyPlanes 的 属性 信息时,我正在尝试 create a list of classP。到目前为止,我的尝试似乎是徒劳的,这是我到目前为止的进展:

可变道具是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

如有任何帮助,我们将不胜感激

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

不幸的是,它不起作用,因为 that.You 还需要使用 Reflection 来创建一个新实例:

var list = (List<ClassP>)Activator.CreateInstance(prop.PropertyType);

CreateInstance 方法 returns object。如果您在编译时不知道类型,则无法对其进行强制转换。你能做的最好的事情就是使用 dynamic。这样你就可以访问任何成员而不会出现任何编译时错误,但显然它不安全。

你可能应该重新考虑你是否真的需要使用Reflection here.If你的问题可以不用Reflection来解决那么你应该走那条路

当你有类型时要创建泛型class,你不能使用括号<>,因为你在编译时不知道类型。你需要做这样的事情:

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> 或其他东西)。所以我会留下我的答案,以防你遇到这种情况。