EF перегрузка универсального метода - PullRequest
0 голосов
/ 06 апреля 2011

Я бы хотел сделать возможной перегрузку универсального метода.Поскольку мне нужно создать ObjectSet<..>, не зная универсального типа, содержащегося в нем, я хочу создать что-то вроде этого:

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

Как мне достичь своей цели ..?

Обновление:

@ BrokenGlass wrote:

Этот тип ограничений невозможен в 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 голосов
/ 07 апреля 2011

дизъюнктивное общее ограничение не имеет смысла.Эти ограничения предоставляют методу информацию во время компиляции, поэтому нет особого смысла в ограничениях, которые приводят к неоднозначному типу во время компиляции.Например, если ваш метод просто прибегает к проверке типов во время выполнения, вы можете просто сделать это:

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 ...
}
0 голосов
/ 06 апреля 2011

Этот тип ограничения невозможен в C # - однако вы можете ограничиться IFoo и иметь IMyFirst и IMySecond, оба реализуют IFoo.

Если вы можете жить с зависимостями от Entity Framework, вы также можете использовать EntityObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...