gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:24 25 4
gpt4 key购买 nike

我正在尝试使用泛型将对象列表转换为其父对象。我有这样的类(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 引用获取该字段,但我无法转换列表。字段值是节点引用列表,但似乎无法将其转换为实体列表,这应该是可能的,因为它继承自实体。

转换到节点列表反而有效,但我也希望代码能够获取 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> , 调用 ToList()IEnumerable<Entity> 上应该没问题。

关于C# 泛型,将泛型列表转换到已知的父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16545316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com