Bir özellik üyesini çekmek ve üzerinde hareket etmek için İfade parametresini kullanan bazı uzantı yöntemleri var ve üzerinde bir üye için IEnumerable olduğu özel durum için bir aşırı yük var <>. Ancak, genel bir sınıfın içinden çağrıldığında beklenen yöntem yükü ile eşleşmiyor gibi görünmüyor ('un altındaki r4 için ). Sınıfın dışında doğru yöntem seçilir.Genel türleri ve İfadeleri kullanarak uzantı yöntemi seçimi
Burada neler oluyor? Bu işe yarayacak mı yoksa yeni bir yaklaşım bulmam gerekecek mi?
public class Test
{
public void MyTest()
{
// returns "Object"
var r1 = new MyClass<object>().Ext(a => a.Content);
// returns "Enumerable"
var r2 = new MyClass<IEnumerable<object>>().Ext(a => a.Content);
// returns "Object"
var r3 = new MyClass<object>().TestExt();
// returns "Object" (I was expecting "Enumerable")
var r4 = new MyClass<IEnumerable<object>>().TestExt();
// returns "Enumerable"
var r5 = new MyClass<int>().TestExt2();
}
}
public class MyClass<T>
{
public T Content { get; set; }
public IEnumerable<object> OtherContent { get; set; }
public string TestExt()
{
return this.Ext(a => a.Content);
}
public string TestExt2()
{
return this.Ext(a => a.OtherContent);
}
}
public static class MyExtensions
{
public static string Ext<T>(this T obj, Expression<Func<T, IEnumerable<object>>> memberExpression)
{
return "Enumerable";
}
public static string Ext<T>(this T obj, Expression<Func<T, object>> memberExpression)
{
return "Object";
}
}
Burada sorun ne? –
@KingKing "r4" bildiriminin yanındaki yorumu görün –