我正在尝试使用泛型将对象列表转换为其父类。我有这样的类:
Entity
Node
OtherClass
其中Node/OtherClass继承自Entity。我想做的是这样的:
Type toType = typeof(Node); // Actually not gotten this way
Object fieldValue = field.GetValue(item);
List<Entity> entities = (List<Entity>)fieldValue;
foreach (Entity toEnt in entities)
{
// Code using toEnt using its Entity attributes...
}
我能够使用FieldInfo引用获得字段,但我无法转换列表。字段值是节点引用列表,但似乎无法将其强制转换为实体列表,这应该是可能的,因为它继承自实体。
转换为Node的列表而不是工作,但我也希望代码能够接受OtherClass的列表。它也不能将对象转换为List,然后将每个单独的对象转换为Entity。
我尝试使用MakeGenericType,这可能是解决方案的一部分,但我不能让它工作后,相当长一段时间的尝试。
谢谢你的时间!
其他选项的变体,但使用协方差:
var sequence = (IEnumerable<Entity>) field.GetValue(item);
var entities = sequence.ToList();
这依赖于IEnumerable<T>
的泛型协方差,因此只适用于c# 4+和。net 4+。
虽然List<Node>
不是List<Entity>
,但是和IEnumerable<Entity>
…上面的代码利用了。
当然,如果你只是需要迭代,你不需要一个List<Entity>
:
var sequence = (IEnumerable<Entity>) field.GetValue(item);
foreach (var entity in sequence)
{
...
}
但是如果你确实需要创建一个List<Entity>
,在IEnumerable<Entity>
上调用ToList()
应该是好的。
你可以这么做
Linq:
List<Base> listOfBase = new List<Derived>().Cast<Base>().ToList();
您可以使用IEnumerable
并在循环中进行强制转换:
// list of derived objects
IEnumerable nodes = fieldValue;
// process base fields
foreach (Entity toEnt in nodes)
{
// Code using toEnt using its Entity attributes...
}
您只需要确保节点是Entity
派生的