测试代码
using NUnit.Framework;
namespace LocalVarExpression
{
[TestFixture]
public class LocalExpressionTest
{
private int _intField = 2;
public int IntProp { get; set; }
[SetUp]
public void SetUp()
{
IntProp = 4;
}
[Test]
public void TestGetLocalValue()
{
var localVar = 7;
var t1 = LocalExpression.GetValue(() => 1);
var t2 = LocalExpression.GetValue(() => _intField);
var t3 = LocalExpression.GetValue(() => IntProp);
var t4 = LocalExpression.GetValue(() => localVar);
Assert.AreEqual(1, 1);
}
}
}
核心代码
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace LocalVarExpression
{
public class LocalExpression
{
public static object GetValue<T>(Expression<Func<T>> func)
{
object value=new object();
var body = func.Body;
if (body.NodeType == ExpressionType.Constant)
{
value = ((ConstantExpression)body).Value;
}
else
{
var memberExpression = (MemberExpression)body;
var @object =
((ConstantExpression)(memberExpression.Expression)).Value;
if (memberExpression.Member.MemberType == MemberTypes.Field)
{
value = ((FieldInfo)memberExpression.Member).GetValue(@object);
}
else if (memberExpression.Member.MemberType == MemberTypes.Property)
{
value = ((PropertyInfo)memberExpression.Member).GetValue(@object);
}
}
return value;
}
}
}