如何动态分配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);
    }
}

如何动态分配lambda<expression<delegate>>expression< delegate>

Expression.Assign的第二个参数是表达式,表示要分配的值。所以目前你有效地尝试分配一个ItsTrue到属性。你需要包装它,使它是一个表达式返回值itsTrue…通过Expression.QuoteExpression.Constant。例如:

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

或者,你可能想要Expression.Quote -这真的取决于你想要达到的目标。