Biorąc pod uwagę następujący kod:Jeśli mogę rzucić IQueryable jako IEnumerable, a następnie wywołać metodę rozszerzenia Linq, która implementacja zostanie wywołana?
IQueryable<T> queryable;
// something to instantiate queryable
var enumerable = (IEnumerable<T>) queryable;
var filtered = enumerable.Where(i => i > 3);
W końcowej linii, która jest wywoływana metoda rozszerzenie?
Czy to jest IEnumerable<T>.Where(...)
? A może zadzwonić pod numer IQueryable<T>.Where(...)
, ponieważ faktyczna implementacja nadal jest oczywiście możliwa do sprawdzenia?
Prawdopodobnie idealnym rozwiązaniem byłoby wywołanie wersji IQueryable w taki sam sposób, w jaki normalny polimorfizm zawsze będzie korzystał z bardziej szczegółowego nadpisania.
Jednak w Visual Studio, gdy klikam prawym przyciskiem myszy metodę Where i "Go to Definition", jestem przenoszony do wersji IEnumerable, która ma sens z wizualnego punktu widzenia.
Moim głównym zmartwieniem jest to, że jeśli gdzieś w mojej aplikacji używam Linq do NHibernate, aby uzyskać Queryable, ale przekazuję to za pomocą interfejsu, który używa bardziej ogólnego podpisu IEnumerable, stracę cuda odroczonego wykonania bazy danych !
Edit: Okazuje się, że jak Iridium podkreślił, że jest to wersja Enumerable że jest wywoływana
public class Program
{
static void Main(string[] args)
{
var myString2 = new MyString2();
var myString = (MyString)myString2;
Console.WriteLine(myString.Method());
Console.ReadLine();
}
}
public class MyString {}
public class MyString2 : MyString {}
public static class ExtensionMethods
{
public static string Method(this MyString instance)
{
return "MyString method";
}
public static string Method(this MyString2 instance)
{
return "MyString2 method";
}
}
Wyjście jest "metoda MyString".
Zapomniałem zagłosować na pytanie ... było ciekawie się dowiedzieć :). –
http://stackoverflow.com/questions/474074/overriding-extension-methods –
Pamiętaj, że składnia metody rozszerzenia jest po prostu syntaktycznym cukrem dla * wywoływania statycznej metody * i statycznych metod z definicji * użyj analizy statycznej, aby określić, która metoda połączenie*. Jeśli potrzebujesz * analizy środowiska wykonawczego *, musisz napisać kod samodzielnie, aby to zrobić. Ponadto: * nie * jest uważane za pożądane dla IQ, który statycznie IE niespodziewanie zmienia się w ścieżkę kodu IQ; przypuszczalnie rzucisz go na IE, ponieważ * nie chcesz * traktować go jako IQ! Jeśli chcesz traktować to jako iloraz inteligencji, to nie odrzucaj go *. Zasada Groucho: jeśli boli, kiedy to robisz, * nie rób tego *. –