C# 在列表的派生类上设置属性<;T>;使用反射在运行时实例化

C# 在列表的派生类上设置属性<;T>;使用反射在运行时实例化,c#,reflection,C#,Reflection,我正在使用反射实例化一个自定义类` class MyList:MyBaseClass,IList´: foreach (FieldInfo field in this.GetType().GetFields()) { if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(MyList<>)) { var elementT

我正在使用反射实例化一个自定义类` class MyList:MyBaseClass,IList´:

foreach (FieldInfo field in this.GetType().GetFields())
{
   if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(MyList<>))
   {
      var elementType = field.FieldType.GetGenericArguments()[0];
      var listType = typeof(MyList<>).MakeGenericType(elementType);
      var valueToSet= Activator.CreateInstance(listType);
      field.SetValue(this, valueToSet);
      ...
      valueToSet.MyName = field.Name; // does not work because "valueToSet" does not recognize this property
      ...
   }
}
foreach(此.GetType().GetFields()中的FieldInfo字段)
{
if(field.FieldType.IsGenericType&&field.FieldType.GetGenericTypeDefinition()==typeof(MyList))
{
var elementType=field.FieldType.GetGenericArguments()[0];
var listType=typeof(MyList).MakeGenericType(elementType);
var valueToSet=Activator.CreateInstance(listType);
字段.SetValue(此字段为valueToSet);
...
valueToSet.MyName=field.Name;//不起作用,因为“valueToSet”无法识别此属性
...
}
}
问题是,部件
valueToSet.MyName=field.Name
无法识别自定义类
MyList
具有的属性
MyName
。我还尝试将我的
MyList
定义为
class MyList:MyBaseClass,IList
,但是
valueToSet.MyName=field.Name
部分现在抛出错误
System.ArgumentException HResult=0x80070057 Message=Object类型的对象。MyList 1[System.Object]无法转换为Object类型。MyList 1[MyNameSpace.MyObjectType1]…

有没有关于如何解决这个问题的提示?我想保留我的原始声明,不使用
动态


提前谢谢

有几种方法。你可以选择一个你认为最适合你的

继续使用反射

PropertyInfo myNameProperty = listType.GetProperty("MyName");
myNameProperty.SetValue(valueToSet, field.Name);
使用
动态

dynamic valueToSet= Activator.CreateInstance(listType);
...
valueToSet.MyName = field.Name;
转换为超类

显然,正如您在评论中所说,您可以在
MyBaseClass
中声明
MyName
。这是一件不寻常的事情,但好吧。。。鉴于
MyBaseClass
中声明了
MyName
,您可以将
valueToSet
转换为
MyBaseClass

((MyBaseClass)valueToSet).MyName = field.Name;

有几种方法。你可以选择一个你认为最适合你的

继续使用反射

PropertyInfo myNameProperty = listType.GetProperty("MyName");
myNameProperty.SetValue(valueToSet, field.Name);
使用
动态

dynamic valueToSet= Activator.CreateInstance(listType);
...
valueToSet.MyName = field.Name;
转换为超类

显然,正如您在评论中所说,您可以在
MyBaseClass
中声明
MyName
。这是一件不寻常的事情,但好吧。。。鉴于
MyBaseClass
中声明了
MyName
,您可以将
valueToSet
转换为
MyBaseClass

((MyBaseClass)valueToSet).MyName = field.Name;

很抱歉这是一个打字错误。。。已经在我的帖子中更正。。。感谢您的观察!
MyName
是否有可能在
MyBaseClass
中声明?没有,但如果有必要,我可以解决这个问题……对不起!这是一个打字错误。。。已经在我的帖子中更正。。。感谢您的观察!
MyName
是否有可能在
MyBaseClass
中声明?没有,但如果有必要,我可以解决这个问题……是否有办法将硬编码的
“MyName”
更改为更通用和可重构的格式?@anna是的,
nameof(MyList.MyName)
。这里的通用参数
object
并不重要,因为您只需要字符串
“MyName”
。谢谢!你的3个解决方案对我都很有效!!有没有办法将硬编码的
“MyName”
更改为更通用、更可重构的格式?@anna Yes,
nameof(MyList.MyName)
。这里的通用参数
object
并不重要,因为您只需要字符串
“MyName”
。谢谢!你的3个解决方案对我都很有效!!