相关疑难解决方法(0)

使用正确的派生类型调用泛型方法

我有以下场景:

我有三个课程,让我们打电话给他们A,B然后C.它们的共同点是它们从相同的接口继承,ISomeInterface并且它们是使用Entity Framework映射到实体的类.

我有一个方法接收实现此接口的对象列表,但对象本身将是A,B或的实例C.

方法shell看起来像这样

public void MyMethod(List<ISomeInterface> entityList)
{
  foreach(var entity in entityList)
  {
    ProcessEntity(entity);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,问题在于ProcessEntity方法.这是一个通用方法,需要根据类型或实体从数据库中检索匹配元素的表,所以它看起来像这样:

public void ProcessEntity<T>(T entity)
{
  using( var repository = new DbRepository())
  {
    var set = repository.Set<T>();
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

的问题是,行var set = repository.Set<T>();失败,因为TISomeInterface在这种情况下,而不是实际的类型(A,BC),所以它提供了一个例外即可以不涉及到给定的类型,这是可以理解的.

所以我的问题是:我如何使用列表中对象的实际类型调用ProcessEntity,而不是它们实现的接口类型.

c# generics inheritance

9
推荐指数
1
解决办法
2226
查看次数

从非泛型基类调用泛型方法/委托

我觉得我不是从正确的角度看待这个问题,而我只是没有考虑其他解决方案.

假设这个泛型类;

public abstract class Port<T>
{
    public delegate T PullDelegate();

    private PullDelegate pull;

    public Port(PullDelegate pull)
    {
        this.pull = pull;
    }

    public T Pull()
    {
        return pull();
    }
}
Run Code Online (Sandbox Code Playgroud)

它用于在图形节点编辑器中定义"端口".端口可以​​将对象/值从一个节点传输到另一个节点,但它们也需要"类型安全",这意味着我无法将任何端口插入另一个错误类型(至少没有一些转换).

节点"拥有"一个端口并为其一个方法赋予它一个委托,因此当另一个节点"拉"一个值时,该端口只是调用它并返回正确的值.

当我尝试Pull()从非泛型集合调用时,我的问题就出现了.显然,我可以创建一个非泛型的基本方法,但是然后Pull无法返回T,它需要返回object.

此外,每个节点都有其端口的集合访问器,因此其他项目可以获取它们.该收集必须是非泛型的,因为一个节点可以有许多类型的许多端口.

    public abstract Port[] Inputs { get; }
    public abstract Port[] Outputs { get; }
    public abstract Port[] Entries { get; }
    public abstract Port[] Exits { get; }
Run Code Online (Sandbox Code Playgroud)

非泛型类型发挥作用的那一刻,通用的一切都变得无法访问.如果只是Port<>[]一件事.

我觉得我错过了什么......

c# generics

5
推荐指数
1
解决办法
217
查看次数

标签 统计

c# ×2

generics ×2

inheritance ×1