EF泛型方法重载

时间:2011-04-05 23:37:13

标签: c#-4.0 entity-framework-4

我想使泛型方法重载成为可能。 由于我需要在不知道包含在其中的泛型类型的情况下创建ObjectSet<..>,我将构建如下内容:

public IQueryable<T> MyMethod<T>() where T : class, (IMyFirst || IMySecond) //notice the syntax..!
{
  if(typeOf(T) is IMyFirst..
  else ...
}

我如何达到目的..?

更新

@BrokenGlass写道:

  

这种类型的约束在C#中是不可能的 - 但是你可以约束到IFoo并让IMyFirst和IMySecond都实现IFoo。

但该建议不适用,请参阅:

interface1 { property1 {..}}
interface2 { property2 {..}}
interfaceIFoo : interface1, interface2 { }

通过任何方法:

MyWrapper.Retrieve<EntityProduct>(myObjContext); //error-> EntityProduct implements interface1 only!!

通过其他任何方法:

MyWrapper.Retrieve<EntityOrder>(myObjContext); //error-> EntityOrder implements interface2 only!!

在这里:

public static IQueryable<T> Retrieve<T>(ObjectContext context) where T :class, interfaceIFoo    
{
var query = context.CreateObjectSet<T>().AsQueryable();
//...

2 个答案:

答案 0 :(得分:0)

这种类型的约束在C#中是不可能的 - 但是你可以约束到IFoo并让IMyFirstIMySecond都实现IFoo

如果您可以使用Entity Framework的依赖项,您也可以使用EntityObject

答案 1 :(得分:0)

析取通用约束并不真正有意义。这些约束为方法提供了编译时信息,因此在编译时导致模糊类型的约束没有多大意义。例如,如果您的方法只是采用运行时类型检查,那么您也可以这样做:

public IQueryable<T> MyMethod<T>() where T : class
{
    if (typeOf(T) is IMyFirst) ...
    else ...
}

如果您觉得需要对输入和伪抽象进行类型检查,那么恰好具有相同名称的扩展方法就足够了:

public static IQueryable<IMyFirst> MyMethod(this IMyFirst input)
{
    return ...
}

public static IQueryable<IMySecond> MyMethod(this IMySecond input)
{
    return ...
}