使用反射创建通用List <T>

rkm*_*max 5 c# reflection

我有一个属性的班级IEnumerable<T>.如何创建一个创建新List<T>属性并分配该属性的泛型方法?

IList list = property.PropertyType.GetGenericTypeDefinition()
    .MakeGenericType(property.PropertyType.GetGenericArguments())
    .GetConstructor(Type.EmptyTypes);
Run Code Online (Sandbox Code Playgroud)

我不知道T型在哪里可以是任何东西

Jos*_*osh 18

假设您知道属性名称,并且您知道它是一个,IEnumerable<T>那么此函数会将其设置为相应类型的列表:

public void AssignListProperty(Object obj, String propName)
{
  var prop = obj.GetType().GetProperty(propName);
  var listType = typeof(List<>);
  var genericArgs = prop.PropertyType.GetGenericArguments();
  var concreteType = listType.MakeGenericType(genericArgs);
  var newList = Activator.CreateInstance(concreteType);
  prop.SetValue(obj, newList);
}
Run Code Online (Sandbox Code Playgroud)

请注意,此方法不进行类型检查或错误处理.我将其作为练习留给用户.