我有一些扩展方法使用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";
}
}