Expressionパラメーターを使用してプロパティ メンバーを取得し、それに基づいて動作するいくつかの拡張メソッドがあり、メンバーがIEnumerable<>である特定のケースのオーバーロードがあります。ただし、ジェネリック クラス内から呼び出された場合に予想されるメソッド オーバーロードと一致しないようです (以下の r4 の場合)。クラスの外では、正しいメソッドが選択されます。
何が起きてる?これはうまくいくでしょうか、それとも新しいアプローチを見つける必要がありますか?
(これは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";
}
}