式ツリーを調べることで、定数、インスタンスフィールド、プロパティの値を取得できますが、メソッドで定義されているローカル変数は取得できません。式ツリー内からローカル変数の値にアクセスする方法
以下を実行すると、定数、インスタンスフィールドとプロパティから1、2、3が出力され、次にGetValueを呼び出すためにFieldInfoが宣言されているインスタンスを取得する方法がわからないため例外が発生します( )をローカル変数に追加します。
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));
}
}
}
}
}
これは.NETの私のバージョンで動作します。メソッドが実際に実行されていない限り、変数は存在しません。 –
[反射を介してローカル変数を取得することはできますか?](http://stackoverflow.com/questions/11118084/is-it-possible-to-get-local-variables-through-reflection) – CarbineCoder
あなたは取得しようとしている?パラメータ名は?私はちょっと混乱していますが、必要なものがあればメソッドを呼び出す前に、常にグローバル変数を設定するオプションがあります。 –