ho alcuni metodi di estensione che utilizzano un parametro Expression per tirare in un elemento di struttura e agire su di esso, e ho un sovraccarico per il caso particolare in cui l'elemento è un IEnumerable <>. Tuttavia, non sembra corrispondere al sovraccarico del metodo previsto quando viene richiamato da una classe generica (per r4 al di sotto di). Al di fuori della classe viene selezionato il metodo corretto.estensione utilizzando tipi generici ed espressioni
Cosa sta succedendo qui? Funzionerà mai o devo trovare un nuovo approccio?
(questo è in C# 5)
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";
}
}
Cosa c'è che non va qui? –
@KingKing Vedi il commento accanto alla dichiarazione di 'r4' –