虽然从迁移到VS2010 VS2012的一个项目,我遇到了以下问题。 该项目使用反射了很多,为了从下面的代码放在一个接口获得的MethodInfo:
Expression<Func<ITest, Func<ServiceRequest, ServiceResponse>>> expression = scv => scv.Get;
UnaryExpression unaryExpression = expression.Body as UnaryExpression;
MethodCallExpression methodCallExpression = unaryExpression.Operand as MethodCallExpression;
ConstantExpression constantExpression = methodCallExpression.Arguments[2] as ConstantExpression;
MethodInfo myMethod = constantExpression.Value as MethodInfo;
这工作得很好用VS2010编译,但methodCallExpression.Arguments.Count()为2,如果代码与VS2012针对.NET 4.0编译。
反编译后,我注意到,编译器对于相同的表达产生不同的代码。
这是一个设计问题,因为设计不应该的“幻数”接力像2号上methodCallExpression.Arguments [2]。 我试图找到这个用以下解决方案:
MethodCallExpression outermostExpression = expression .Body as MethodCallExpression;
MethodInfo myMethod = outermostExpression.Method;
但是outermostExpression为空。
最后,我做了它的工作改变表达如下:
Expression<Func<ITest, ServiceResponse>> expression = scv => scv.Get(default(ServiceRequest));
MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
Assert.AreEqual("Get", outermostExpression.Method.Name);
这是不理想,但它的工作原理上都VS2010和VS2012。
有没有办法从像下面的表达式找到的MethodInfo:
Expression<Func<ITest, ServiceResponse>> expression = scv => scv.Get(default(ServiceRequest));
MethodInfo methodInfo = GetInnerMethodInfo( expression );
Assert.AreEqual("Get", methodInfo.Name);