C# 在列表的派生类上设置属性<;T>;使用反射在运行时实例化
我正在使用反射实例化一个自定义类` class MyList:MyBaseClass,IList´: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
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个解决方案对我都很有效!!