person.Name = "Joe Bloggs"
以下代码通过使用表达式树动态创建方法来执行简单的属性分配失败,并出现NullReferenceException
- 就像person
我创建的参数没有被传入一样。
有任何想法吗?
class Person
{
public string Name { get; set; }
}
static void ExpressionTest()
{
var personParam = Expression.Parameter(typeof(Person), "person");
var block = Expression.Block(new[] { personParam },
Expression.Assign(
Expression.Property(personParam, "Name"), Expression.Constant("Joe Bloggs"))
);
/*
* block.DebugView in debugger shows:
*
* .Block(MyProject.MyNamepace.Person $person) {
* $person.Name = "Joe Bloggs"
* }
*
*/
var method = Expression.Lambda<Action<Person>>(block, personParam).Compile();
var person = new Person();
method(person); // **throws** System.NullReferenceException: ... at lambda_method(Closure , Person )
Debug.WriteLine(person.Name); // I expect this to print "Joe Bloggs"
}
更新
感谢您提供出色的答案,我首先看到了@decPL,这使我new[] { personParam }
从Expression.Block
通话中删除了。
范围变量和您需要首先定义它们(就像某些语言强迫您那样)这一切都是完全有道理的Block
- 我的问题是我不需要任何变量但是被DebugView
调试器向您展示的神奇属性误入歧途认为它们是参数,并且Block
就像一个函数定义:
.Block(MyProject.MyNamepace.Person $person) {
$person.Name = "Joe Bloggs"
}
......当然不是。顾名思义,这是一段代码,呵呵!