繁体   English   中英

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

[英]C# Generics, casting generic list to known parent class?

我正在尝试使用泛型将对象列表强制转换为其父对象。 我有以下课程:

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引用获取字段,但无法投射列表。 字段值是“节点列表”引用,但似乎无法将其强制转换为“实体列表”,因为它是从Entity继承的。

而是强制转换为Node列表,但我也希望代码能够采用OtherClass的列表。 将对象强制转换为对象列表,然后将每个对象强制转换为实体也无效。

我尝试使用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派生的即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM