【问题标题】:How to access a property which is a class using Expressions如何使用表达式访问作为类的属性
【发布时间】:2018-01-19 15:18:02
【问题描述】:

我有一个名为“User”的类,它有一个定义为“Department”类的属性(我也想知道它叫什么,哈哈)。我想访问名为“Name”(User.Department.Name)的“Department”类中的属性。当我将参数输入到编译的表达式中时,它会抛出 NulLReferenceException。

我在下面有这段代码。提前致谢。

        ParameterExpression paramExpr = Expression.Parameter(typeof(User), "user");
        MemberExpression depPropExpr = MemberExpression.Property(paramExpr, "Department");
        MemberExpression depNamePropExpr = MemberExpression.Property(depPropExpr, "Name");
        ConstantExpression constantExpression = Expression.Constant("SBCA");

        var expression = Expression.Assign(depNamePropExpr, constantExpression); var compiledExpression = Expression.Lambda<Action<User>>(expression, new[] { paramExpr }).Compile();
        compiledExpression(user);

【问题讨论】:

  • 你的代码有什么问题?
  • 编写代码,就像不用表达式一样。然后构建表达式树。
  • 当我编译它时它会抛出一个 NullReferenceException。 var compiledExpression = Expression.Lambda>(expression, new[] { paramExpr }).Compile();编译表达式(用户);
  • 你是怎么编译的?你如何使用它? Edit您的问题并包括所有相关部分
  • 谢谢,我会深入研究的。

标签: c# expression-trees


【解决方案1】:

正如您在.NET Fiddle 中看到的那样,您的代码运行良好。

public class Program
{

    public static void Main()
    {
        var user = new User();
        user.Department = new Department();
        user.Department.Name = "hello";
        Console.WriteLine("Before: " + user.Department.Name);

        ParameterExpression paramExpr = Expression.Parameter(typeof(User), "user");
        MemberExpression depPropExpr = MemberExpression.Property(paramExpr, "Department");
        MemberExpression depNamePropExpr = MemberExpression.Property(depPropExpr, "Name");
        ConstantExpression constantExpression = Expression.Constant("SBCA");

        var expression = Expression.Assign(depNamePropExpr, constantExpression);

        var compiledExpression = Expression.Lambda<Action<User>>(expression, new[] { paramExpr }).Compile();
        compiledExpression(user);
        Console.WriteLine("After: " + user.Department.Name);
    }
}

public class User
{
    public Department Department { get; set; }
}

public class Department
{
    public string Name { get; set; }    
}

输出:

之前:你好
之后:SBCA

问题(NullReferenceException)是user.Departmentnull,而您的表达式正在执行user.Department.Name = "SBCA";
您可以通过删除user.Department = new... 的分配来测试这一点

【讨论】:

  • 再次感谢先生。
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多