作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下场景:
我有三个类(class),我们称它们为A
, B
和 C
.它们的共同点是它们继承自同一个接口(interface),ISomeInterface
并且它们是使用 Entity Framework 映射到实体的类。
我有一个方法接收实现此接口(interface)的对象列表,但对象本身将是 A
的实例。 , B
或 C
.
方法外壳看起来像这样
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
ProcessEntity(entity);
}
}
现在,问题出在 ProcessEntity
上方法。这是一个泛型方法,需要根据类型或实体从数据库中检索匹配元素表,所以它看起来像这样:
public void ProcessEntity<T>(T entity)
{
using( var repository = new DbRepository())
{
var set = repository.Set<T>();
...
}
}
问题是 var set = repository.Set<T>();
行失败,因为 T
是ISomeInterface
在这种情况下,而不是实际类型( A
、 B
或 C
),因此它给出了一个与给定类型无关的异常,这是可以理解的。
所以我的问题是:如何使用列表中对象的实际类型调用 ProcessEntity,而不是它们实现的接口(interface)类型。
最佳答案
将实体传递给 ProcessEntity 时,您可以应用 dynamic
关键字。在这种情况下,实体的实际类型将在运行时确定。
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
dynamic obj = entity;
ProcessEntity(obj);
}
}
关于c# - 使用正确的派生类型调用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10830913/
我是一名优秀的程序员,十分优秀!