我想使泛型方法重载成为可能。
由于我需要在不知道包含在其中的泛型类型的情况下创建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();
//...
答案 0 :(得分:0)
这种类型的约束在C#中是不可能的 - 但是你可以约束到IFoo
并让IMyFirst
和IMySecond
都实现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 ...
}