[英]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.