如何动态分配lambda>expression< delegate>
本文关键字:expression delegate lambda 动态分配 | 更新日期: 2023-09-27 18:04:53
我正在尝试动态表达并将lambda分配给它。结果,我得到了exception:系统。ArgumentException:类型为Test的表达式。ItsTrue'不能用于赋值类型'System.Linq.Expressions.Expression ' 1[Test.ItsTrue]'
怎么了?
public delegate bool ItsTrue();
public class Sample
{
public Expression<ItsTrue> ItsTrue { get; set; }
}
[TestClass]
public class MyTest
{
[TestMethod]
public void TestPropertySetWithExpressionOfDelegate()
{
Expression<ItsTrue> itsTrue = () => true;
// this works at compile time
new Sample().ItsTrue = itsTrue;
// this does not work ad runtime
var new_ = Expression.New(typeof (Sample));
var result = Expression.Assign(
Expression.Property(new_, typeof (Sample).GetProperties()[0]),
itsTrue);
}
}
Expression.Assign
的第二个参数是表达式,表示要分配的值。所以目前你有效地尝试分配一个ItsTrue
到属性。你需要包装它,使它是一个表达式返回值itsTrue
…通过Expression.Quote
或Expression.Constant
。例如:
var result = Expression.Assign(
Expression.Property(new_, typeof (Sample).GetProperties()[0]),
Expression.Constant(itsTrue, typeof(Expression<ItsTrue>)));
或者,你可能想要Expression.Quote
-这真的取决于你想要达到的目标。