在<T>运行时使用反射实例化的 List 派生类上设置属性



我正在使用反射来实例化自定义类'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.这是一件不寻常的事情,但好吧...给定MyNameMyBaseClass中声明,您可以将valueToSet转换为MyBaseClass

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

最新更新