如何使用表达式访问 属性 这是 class

How to access a property which is a class using Expressions

我有一个叫做 "User" 的 class,它有一个 属性 定义为 class "Department"(我也想知道它叫什么, 哈哈)。我想访问名为 "Name" (User.Department.Name) 的 "Department" class 中的 属性。当我将参数输入编译表达式时,它会抛出 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);

正如您在此 .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; }    
}

输出:

Before: hello
After: SBCA

问题 (NullReferenceException) 是 user.Departmentnull,你的表达式是 user.Department.Name = "SBCA";.
您可以通过删除 user.Department = new...

的分配来测试它