gpt4 book ai didi

c# - 在 C# 中使用反射初始化 IEnumerable 属性 (propertyInfo)

转载 作者:行者123 更新时间:2023-12-02 00:51:01 24 4
gpt4 key购买 nike

假设一个类(可能是其他类)

class Foo()
{
IEnumerable<int> SomeNumbers { get; set; }
IEnumerable<string> SomeStrings { get; set; }
int[] ArrayOfInt { get; set; }
List<int> AListOfIntegers { get; set; }
}

还有一个方法

void Initialize(object obj)
{
var props = obj.getType().GetProperties();
foreach(var prop in props)
{
//Some logic in case property is a single value, this is using:
//Convert.ChangeType(value, property.PropertyType, null)

var list = //Do Some Magic
prop.SetValue(obj, list, null);
}
}

如何创建正确类型的列表?

我试过:

var list = property.PropertyType.GetConstructor(new CType[0]).Invoke(new object[0]);

但这行不通,因为 IEnumerable 没有构造函数(它是一个接口(interface)),但是任何父类(super class)型在这里都可以。

var list = Enumerable.Empty<property.PropertyType.MemberType>();

甚至不合法

最佳答案

您可以创建 List<T> 的实例继承IEnumerable<T>使用此代码:

var genericType = property.PropertyType.GetGenericArguments().First();     
var instance = Activator.CreateInstance(typeof(List<>).MakeGenericType(genericType));

结果 instance可以设置为属性值。

prop.SetValue(obj, instance, null);

您也可以创建空的 Enumerable<T>使用此代码:

var genericType = property.PropertyType.GetGenericArguments().First();             
var method = typeof(Enumerable).GetMethod("Empty").MakeGenericMethod(genericType);
var emptyEnumerable = method.Invoke(null, null);

关于c# - 在 C# 中使用反射初始化 IEnumerable 属性 (propertyInfo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39851785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com