1

同様の投稿をいくつか見てきましたが、宣言した var1 を別の場所に渡す必要があるようですが、理解できないようです。

public Expression<Func<ElementNode, bool>> CreateEqualNameExpression(string match)
{
    var parm = Expression.Parameter(typeof(ElementNode), "element");

    var expr = Expression.Call(parm, typeof(ElementNode).GetProperty("Name").GetGetMethod());
    var var1 = Expression.Variable(typeof(string), "elementName");
    var assign = Expression.Assign(var1, expr);

    var parm2 = Expression.Constant(match, typeof(string));

    var exp = Expression.Equal(assign, parm2);

    return Expression.Lambda<Func<ElementNode, bool>>(exp, new[] { parm });
}

基本的に私は表すメソッドを作成しようとしています

(ElementNode ele) => ele.Name == match;

しかし、私は解決策を思いつくのに本当に苦労しています。どんな助けでも大歓迎です。

エラーが表示されます: タイプ 'System.STring' の 'elementName' がスコープから参照されています'' が、定義されていません。

4

3 に答える 3

3

他の人が言ったように、実際には中間変数は必要ありませんが、式ツリーについて学ぼうとしているのを見ると、知っておくとよい情報です。

ローカル変数は 内で宣言する必要がありますBlockExpression:

public Expression<Func<ElementNode, bool>> CreateEqualNameExpression(string match)
{
    var parm = Expression.Parameter(typeof(ElementNode), "element");

    var expr = Expression.Property(parm, "Name");
    var var1 = Expression.Variable(typeof(string), "elementName");
    var assign = Expression.Assign(var1, expr);

    var parm2 = Expression.Constant(match, typeof(string));

    var exp = Expression.Equal(var1, parm2);

    return Expression.Lambda<Func<ElementNode, bool>>(
        Expression.Block(new[] { var1 }, assign, exp),
        parm);
}

おおよそ次のものが作成されます。

element => { var elementName = element.Name; return elementName == <constant>; }

Propertyを使用するのではなく、メソッドを使用してプロパティ アクセサーを作成したことに注意してくださいCall。プロパティがパブリックでない場合を除き、これはプロパティにアクセスするための推奨される方法です。

于 2013-11-07T17:09:42.167 に答える
2

嫌なほど簡単なバージョンが欲しいですか?

Expression.Lambda<Func<ElementNode, bool>> func = elem => elem.Name == match;

.Net が式ツリーを作成します。


ところで、コードには誤りがあります。「assign」ではなく、var1 を一致 (parm2) と比較する必要があります。

var exp = Expression.Equal(var1, parm2);
于 2013-11-07T05:18:19.197 に答える