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

标签 c# .net c#-4.0 generics reflection

我正在尝试使用泛型将对象列表转换为其父对象。我有这样的类(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/

相关文章:

jquery - 跨源请求被阻止 : The Same Origin Policy disallows reading the remote resource MVC 5

c# - 以编程方式更改选项卡顺序

javascript - 如何将带有时区的 json/javascript 日期解析为 C# DateTime?

c# - IList<object[]> XmlSerializer 与通用列表的序列化

c# - 在 linq 中使用 GroupBy 时,如何获取组名列表?

c# - 为什么 "dynamic"在用作泛型类型参数时对于所有类型都不是协变和逆变的?

c# - 为什么我不能从对象访问常量?

c# - html 敏捷包 vs antixss

c# - 使用 C# 获取 Active Directory 中用户的父 OU

.net - 如何在 VS 2010 中打开 .NET 2.0 项目而不进行转换?