首页 > 解决方案 > 从父列表中调用通用子函数

问题描述

我有以下课程以构建流程列表

public abstract class Flow
{
    public string Name { get; set; }
}
    
public class Flow<T> : Flow
{
    public Entity<Personnel, T> MyEntity { get; set; }
}

这是我的 Flow 列表(每个 Flow 都是 Flow 类型,其中 T 可以不同)

private List<Flow> _flow = new List<Flow>();

然后我在我的 List 中添加了一些 Flow :

_flow.Add(new Flow<Type1>() { MyEntity = new ... , FileName = ... });
_flow.Add(new Flow<Type2>() { MyEntity = new ... , FileName = ... });
_flow.Add(new Flow<Type3>() { MyEntity = new ... , FileName = ... });
_flow.Add(new Flow<Type4>() { MyEntity = new ... , FileName = ... });

最后,我想在列表的每个元素上调用 Entity.Map 函数,如下所示,但这不起作用:

foreach (var flow in _flow)
{
     var currentResult= flow.MyEntity.Map();
     var currentFilename = flow.FileName;
     ...
}

它告诉我“Flow 不包含 MyEntity 的定义”

标签: c#listgenericspolymorphism

解决方案


编译器是正确的 -Flow不包含调用的方法MyEntity-Flow<T>确实。

MyEntity此外,您正在添加具有不同泛型参数的泛型“流”——如果所有元素都具有不同的实体类型,您如何知道类型是什么?换句话说, 的类型是currentResult什么?

可以使用dynamic并将所有这些绑定推迟到运行时,这意味着您必须确保其中的每个元素_flow都有一个MyEntity属性,但您不会知道该变量在编译类型时的类型(这意味着必须是动态的出色地)。

所有这一切都说没有一个明显的解决方案 - 你有一个松散相关实体的列表 - 这意味着它们只是因为它们都是泛型类型的实例而相关,但你不知道这些类型是什么在编译时。


推荐阅读