Aşağıdaki kodu dikkate alarak:IEnumerable olarak bir IQueryable kullanırsam Linq uzantı yöntemini çağırın, hangi uygulama çağrılır?
IQueryable<T> queryable;
// something to instantiate queryable
var enumerable = (IEnumerable<T>) queryable;
var filtered = enumerable.Where(i => i > 3);
Son satırda hangi uzatma yöntemi çağrılır?
Bu IEnumerable<T>.Where(...)
mı? Veya IQueryable<T>.Where(...)
çağrılacak çünkü gerçek uygulama hala acilen olabilir mi?
Muhtemelen ideal, normal polimorfizmin her zaman daha spesifik bir geçersiz kılma kullanacağı şekilde, çağrılacak IQueryable versiyonu için olacaktır.
Visual Studio'da Nerede yöntemini ve "Tanıma Git" i sağ tıklattığımda IEnumerable sürümüne gidiyorum, görsel bakış açısından anlam ifade eder.
Benim temel endişe eğer bir yerde Queryable almak için Linq NHRbernate kullanmak, ama ben daha genel IEnumerable imzası kullanan bir arayüz kullanarak bunu geçmek, ben ertelenmiş veritabanı yürütme harikaları kaybedersiniz !
Düzenleme: Iridium'un işaret ettiği gibi, Xzx74
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";
}
}
olarak adlandırılan Enumerable sürümü çıktı "MyString yöntemi" dir.
Soruyu oylamayı unuttunuz ... Bulmak ilginçti :). –
http://stackoverflow.com/questions/474074/overriding-extension-methods –
Unutmayın, uzantı yöntemi sözdizimi, * statik yöntemle * ve statik yöntemlerin çağrılması için * sözdizimsel bir şekerdir. aramak*. * Çalışma zamanı * analizi istiyorsanız, bunu yapmak için kodu kendiniz yazmanız gerekir. Üstelik, IQ kod yoluna beklenmedik bir şekilde geri dönüşü olan bir IE için statik olarak bir IQ için arzu edilen * kabul edilmez *; Muhtemelen bir IE'ye atıyorsunuz çünkü * bir IQ olarak davranmak istemiyorsunuz! Eğer bir IQ olarak davranmak istiyorsanız, o zaman * atmayın *. Groucho kuralı: Bunu yaparken acıtıyorsa, bunu yapma *. –