这是一个打印 a 的方法签名的简单应用程序MethodCallExpression
:
using System;
using System.Linq;
using System.Linq.Expressions;
class A
{
public virtual void Foo() { }
}
class B : A
{
public override void Foo() { }
}
class C : B
{
public override void Foo() { }
}
class Program
{
static void Main(string[] args)
{
PrintMethod<A>(a => a.Foo());
PrintMethod<B>(b => b.Foo());
PrintMethod<C>(c => c.Foo());
Console.Read();
}
static void PrintMethod<T>(Expression<Action<T>> expression)
{
var body = (MethodCallExpression)expression.Body;
var method1 = body.Method;
var method2 = typeof(T).GetMethod(body.Method.Name, body.Method.GetParameters().Select(p => p.ParameterType).ToArray());
Console.WriteLine("body.Method -> " + method1.DeclaringType.ToString() + " - " + method1.ToString());
Console.WriteLine("typeof(T).GetMethod -> " + method2.DeclaringType.ToString() + " - " + method2.ToString());
}
}
我希望程序打印出来:
body.Method -> A - Void Foo()
typeof(T).GetMethod -> A - Void Foo()
body.Method -> B - Void Foo() *
typeof(T).GetMethod -> B - Void Foo()
body.Method -> C - Void Foo() *
typeof(T).GetMethod -> C - Void Foo()
但它反而打印出:
body.Method -> A - Void Foo()
typeof(T).GetMethod -> A - Void Foo()
body.Method -> A - Void Foo() *
typeof(T).GetMethod -> B - Void Foo()
body.Method -> A - Void Foo() *
typeof(T).GetMethod -> C - Void Foo()
在获取Method
继承的属性时MethodCallExpression
,它总是返回A
s MethodInfo
(根类)。
但是,在 Visual Studio 和我对每个调用的“转到定义”中Foo()
,我按预期被带到了每个被覆盖的方法。
为什么MethodCallExpression.Method
会有这种行为?规范中有什么关于这个的吗?为什么VS和Method
物业有出入?我已经使用 .NET 4.0 和 4.5 进行了测试。