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

时间:2014-12-31 16:54:45

标签: c# entity-framework

免责声明:我要在下面粘贴的代码是我的问题的一个示例。它不是真正的代码,出于问题的目的,我没有必要发布完整的代码,因为我已经隔离了这个问题。

我有一个通用的方法来调用" 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);

1 个答案:

答案 0 :(得分:3)

重载解析在编译时完成。这意味着编译器必须在知道泛型类型之前选择重载。由于没有通用约束,因此它选择了哪种有意义的对象类型。

现在当然在这个特定的例子中你不需要键的泛型类型,你可以像实际的Find方法一样使params对象[]键。

相关问题