2

我正在尝试制作动态表达式并将 lambda 分配给它。结果,我得到了异常:System.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);
    }
}
4

1 回答 1

1

的第二个参数Expression.Assign是表示要分配的值的表达式。因此,目前您正在有效地尝试将 an 分配ItsTrue给该属性。您需要将其包装,使其成为返回值的表达式itsTrue... viaExpression.QuoteExpression.Constant. 例如:

var result = Expression.Assign(
    Expression.Property(new_, typeof (Sample).GetProperties()[0]), 
    Expression.Constant(itsTrue, typeof(Expression<ItsTrue>)));

或者,您可能想要Expression.Quote- 这实际上取决于您想要实现的目标。

于 2013-03-20T22:18:39.540 回答