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



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

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); 

相关内容

  • 没有找到相关文章

最新更新