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

Øyv*_*hen 9 c# generics inheritance

我有以下场景:

我有三个课程,让我们打电话给他们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,而不是它们实现的接口类型.

Ser*_*kiy 14

您可以dynamic在将实体传递给ProcessEntity时应用关键字.在这种情况下,将在运行时确定实际类型的实体.

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