1. 程式人生 > >Expression 如何獲取表示式中變數的值

Expression 如何獲取表示式中變數的值

測試程式碼

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
{
    /// <summary>
    /// 支援本地變數的Expression
    /// </summary>
    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; } } }