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);

EF 上的 Find() 迫使我在泛型方法的调用中指定类型

重载解析是在编译时完成的。这意味着编译器必须先选择重载,然后才能知道泛型类型。由于没有通用约束,因此它选择有意义的对象类型。

当然,在这个特定示例中,您不需要键的泛型类型,您可以像实际的 Find 方法一样将其参数化为 object[] 键。