1

我正在尝试使用泛型将对象列表投射到其父级。我有这样的课程:

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 参考获取该字段,但我无法转换列表。字段值是节点引用列表,但似乎无法将其转换为实体列表,这应该是可能的,因为它继承自实体。

改为转换为节点列表是可行的,但我也希望代码能够获取 OtherClass 的列表。转换为对象列表,然后将每个单独的对象转换为实体也不起作用。

我尝试使用 MakeGenericType,这可能是解决方案的一部分,但经过一段时间的尝试后我无法让它工作。

谢谢你的时间!

4

3 回答 3

6

其他选项的变体,但使用协方差:

var sequence = (IEnumerable<Entity>) field.GetValue(item);
var entities = sequence.ToList();

这依赖于 的通用协方差IEnumerable<T>,因此仅适用于 C# 4+ 和 .NET 4+。

虽然 aList<Node>不是 a List<Entity>,但它一个IEnumerable<Entity>... ,上面的代码利用了它。

当然,如果您只需要迭代,则不需要List<Entity>

var sequence = (IEnumerable<Entity>) field.GetValue(item);
foreach (var entity in sequence)
{
    ...
}

但是,如果您确实需要创建 a List<Entity>,调用ToList()anIEnumerable<Entity>应该没问题。

于 2013-05-14T14:14:33.223 回答
4

你可以这样做

林克:

List<Base> listOfBase = new List<Derived>().Cast<Base>().ToList();
于 2013-05-14T14:08:30.917 回答
0

您可以IEnumerable在循环中使用并进行强制转换:

// list of derived objects
IEnumerable nodes = fieldValue;

// process base fields
foreach (Entity toEnt in nodes)
{
    // Code using toEnt using its Entity attributes...
}

您只需要确保节点是Entity派生的。

于 2013-05-14T14:14:04.073 回答