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

C# C泛型,将泛型列表强制转换为已知父类?,c#,.net,c#-4.0,generics,reflection,C#,.net,C# 4.0,Generics,Reflection,我正在尝试使用泛型将对象列表强制转换为其父对象。我的课程包括: Entity Node OtherClass 其中节点/其他类继承自实体。 我想做的是这样的: Type toType = typeof(Node); // Actually not gotten this way Object fieldValue = field.GetValue(item); List<Entity> entities = (List<Entity>)fieldValue;

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

Entity
  Node
  OtherClass
其中节点/其他类继承自实体。 我想做的是这样的:

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

相反,强制转换到节点列表是可行的,但我也希望代码能够获取其他类的列表。强制转换为对象列表,然后将每个对象强制转换为实体也不起作用

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

谢谢你的时间

你可以这么做

林克:

你可以这么做

林克:

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

// list of derived objects
IEnumerable nodes = fieldValue;

// process base fields
foreach (Entity toEnt in nodes)
{
    // Code using toEnt using its Entity attributes...
}
您只需确保节点是实体派生的。

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

// list of derived objects
IEnumerable nodes = fieldValue;

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

您只需确保节点是实体派生的。

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

var sequence = (IEnumerable<Entity>) field.GetValue(item);
var entities = sequence.ToList();
这依赖于IEnumerable的通用协方差,因此仅适用于C4+和.NET4+

虽然列表不是列表,但它是一个IEnumerable。。。上面的代码利用了这一点

当然,如果只需要迭代,则不需要列表:


但如果确实需要创建列表,则可以在IEnumerable上调用ToList。

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

var sequence = (IEnumerable<Entity>) field.GetValue(item);
var entities = sequence.ToList();
这依赖于IEnumerable的通用协方差,因此仅适用于C4+和.NET4+

虽然列表不是列表,但它是一个IEnumerable。。。上面的代码利用了这一点

当然,如果只需要迭代,则不需要列表:


但若确实需要创建列表,则可以在IEnumerable上调用ToList。

列表不会从列表继承,即使节点确实从实体继承。您必须创建一个新列表,并在第一个列表中添加范围。这是一个常见问题。将列表转换为列表不起作用,也不应该起作用。您可以将OtherNode:Entity添加到列表中,但列表不能包含OtherNode。尽管有演员,名单仍然是一个名单。转换不安全,因此是非法的。更安全和合法的转换是从列表到IEnumerable(仅供参考)。列表不从列表继承,即使节点从实体继承。您必须创建一个新列表,并在第一个列表中添加范围。这是一个常见问题。将列表转换为列表不起作用,也不应该起作用。您可以将OtherNode:Entity添加到列表中,但列表不能包含OtherNode。尽管有演员,名单仍然是一个名单。转换是不安全的,因此是非法的。更安全和合法的转换是从列表到IEnumerable,仅供参考。谢谢您的建议。但问题是,我不希望硬编码只能处理派生的,而是希望能够处理所有的实体衍生工具。请按照Jon Skeet的答案来回答。\谢谢你的建议。但问题是,我不希望硬编码只能处理派生的,而是希望能够处理所有的实体派生,请按照Jon Skeet的答案\