【发布时间】:2016-07-13 19:36:30
【问题描述】:
通过检查表达式树,我可以获得常量、实例字段和属性的值,但不能获得方法中定义的局部变量。
执行以下将输出 1、2、3(来自常量、实例字段和属性)然后是一个异常,因为我不知道如何获取声明 FieldInfo 的实例以便调用 GetValue()对于局部变量。
using System;
using System.Linq.Expressions;
using System.Reflection;
namespace Example
{
class Program
{
private int _intField = 2;
static void Main()
{
new Program().Run();
Console.ReadLine();
}
private void Run()
{
IntProp = 3;
var intVariable = 4;
Test(() => 1);
Test(() => _intField);
Test(() => IntProp);
Test(() => intVariable);
}
public int IntProp { get; set; }
void Test<T>(Expression<Func<T>> func)
{
var body = func.Body;
if (body.NodeType == ExpressionType.Constant)
{
Console.WriteLine(((ConstantExpression)body).Value);
}
else
{
var memberExpression = body as MemberExpression;
var @object = memberExpression.Member.DeclaringType == GetType()
? this
: null; //Can I do anything here? Instance of the method the variable is defined in?
if (memberExpression.Member.MemberType == MemberTypes.Field)
{
Console.WriteLine(((FieldInfo)memberExpression.Member).GetValue(@object));
}
else if (memberExpression.Member.MemberType == MemberTypes.Property)
{
Console.WriteLine(((PropertyInfo)memberExpression.Member).GetValue(@object));
}
}
}
}
}
【问题讨论】:
-
您根本无法做到这一点。除非该方法实际运行,否则该变量甚至都不存在。
-
你想得到什么?参数名称?我有点困惑,但你总是可以选择在调用方法之前设置一个“全局”变量。
-
@MatthewWatson 问题标题具有误导性。如果你阅读他的代码,你会看到他在 lambda 内部有一个 captured 变量,在这种情况下,闭包很容易在方法停止运行后存在。你肯定能读懂它的价值。
-
问题标题具有误导性 - 老实说,我不确定我要求的是什么 - 希望代码能证明我在寻找什么。会更新。
标签: c# reflection