2

動的な式を作成し、それにラムダを割り当てようとしています。その結果、例外が発生しました: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

の2番目の引数Expression.Assignは、割り当てる値を表す式です。そのため、現在、プロパティにを効果的に割り当てようとしItsTrueています。値を返す式になるようにラップする必要がありますitsTrue...viaExpression.QuoteまたはExpression.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 に答える