如何使用表达式访问 属性 这是 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.Department
是 null
,你的表达式是 user.Department.Name = "SBCA";
.
您可以通过删除 user.Department = new...
的分配来测试它
我有一个叫做 "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.Department
是 null
,你的表达式是 user.Department.Name = "SBCA";
.
您可以通过删除 user.Department = new...