我正在使用反射来实例化自定义类'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
...
}
}
问题是,部件valueToSet.MyName = field.Name
无法识别我的自定义类MyList<T>
具有的属性MyName
。我还尝试将我的MyList<T>
定义为class MyList<dynamic> : MyBaseClass, IList<dynamic>
但valueToSet.MyName = field.Name
部分现在抛出错误System.ArgumentException HResult=0x80070057 Message=Object of type objects.MyList 1[System.Object] cannot be converted to type objects.MyList 1[MyNameSpace.MyObjectType1]...
关于如何解决这个问题的任何提示?我想保留我的原始声明,无需dynamics
提前感谢!
有几种方法。您可以选择您认为最适合您的一种。
继续使用反射
PropertyInfo myNameProperty = listType.GetProperty("MyName");
myNameProperty.SetValue(valueToSet, field.Name);
使用dynamic
:
dynamic valueToSet= Activator.CreateInstance(listType);
...
valueToSet.MyName = field.Name;
投射到超类
显然,正如您在评论中所说,您可以在MyBaseClass
中声明MyName
.这是一件不寻常的事情,但好吧...给定MyName
在MyBaseClass
中声明,您可以将valueToSet
转换为MyBaseClass
:
((MyBaseClass)valueToSet).MyName = field.Name;