c#泛型,将泛型列表转换为已知的父类



我正在尝试使用泛型将对象列表转换为其父类。我有这样的类:

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派生的

相关内容

  • 没有找到相关文章

最新更新