在 C# 中使用反射初始化 IEnumerable 属性 (属性Info)
initialize an IEnumerable property using reflection in c# (propertyInfo)
假设 class(可能是其他人)
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 没有构造函数(它是一个接口),但任何超类型在这里都可以。
var list = Enumerable.Empty<property.PropertyType.MemberType>();
甚至不合法
您可以使用以下代码创建继承 IEnumerable<T>
的 List<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);
假设 class(可能是其他人)
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 没有构造函数(它是一个接口),但任何超类型在这里都可以。
var list = Enumerable.Empty<property.PropertyType.MemberType>();
甚至不合法
您可以使用以下代码创建继承 IEnumerable<T>
的 List<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);