EF 上的 Find() 迫使我在泛型方法的调用中指定类型
本文关键字:调用 泛型方法 类型 Find 上的 EF | 更新日期: 2023-09-27 18:35:43
免责声明:我将在下面粘贴的代码是我的问题示例。 这不是真正的代码,出于问题的目的,没有必要发布完整的代码,因为我已经隔离了问题。
我有一个在数据集上调用"find"的通用方法,如下所示。
private static void GenericFind<TEntity, T>(T keys) where TEntity : class
{
using (var dc = new AMSContext())
{
var ea = dc.Set<TEntity>().Find(keys);
}
}
如果键是整数,则此方法非常有效,但如果是组合键,则不起作用,类型:object[]。
如果我指定它是查找调用中的一个对象,那么它可以工作。 所 示
var ea = dc.Set<TEntity>().Find(keys as object[]);
以下是对该方法的调用
GenericFind<wf_tasks, int>(1); // Works
GenericFind<WfTaskEa, object[]>(new object[] { 7, 1 }); // Doesn't work unless I force the type in the find call
现在,我可以添加一个测试来查看 T 的类型并强制对象类型。 但我很好奇是否有其他(更好)的方法。
编辑:我当前的工作解决方案
var entity = typeof (T).Name == "Object[]"
? dc.Set<TEntity>().Find(keys as object[])
: dc.Set<TEntity>().Find(keys);
重载解析是在编译时完成的。这意味着编译器必须先选择重载,然后才能知道泛型类型。由于没有通用约束,因此它选择有意义的对象类型。
当然,在这个特定示例中,您不需要键的泛型类型,您可以像实际的 Find 方法一样将其参数化为 object[] 键。