0

プロパティ インデクサー配列

次のラムダ式を動的に生成しようとしています:

Expression<Func<Program, string>> y = _ => _.x[0];

x は List 型です

Expression.MakeIndex を使用しようとしていますが、例外が発生しているようです:

Expression.MakeIndex(parameter, typeof (Program).GetProperty("x"), new[] {Expression.Constant(0)})

例外メッセージ:

メソッド 'System.Collections.Generic.List`1[System.String] get_x()' の呼び出しに指定された引数の数が正しくありません

どうすればこれを正しくすることができますか?

4

2 に答える 2

5

ここで行われている操作は2つあります。

  1. xから取得parameter
  2. インデックス0のアイテムにアクセス

このために2つの別々の式を作成する必要があります。

var property = Expression.Property(parameter, typeof (Program).GetProperty("x"));
var itemAtPosition0 = Expression.MakeIndex(property, typeof(List<string>).GetProperty("Item"),
                     new [] { Expression.Constant(0) });

"Item"インデクサープロパティのデフォルト名を参照します。この名前の詳細と、使用されている実際の名前を確実に検出する方法については、この回答を参照してください。

于 2013-02-15T08:39:59.147 に答える
3

Programこの回答は、クラスが次のように定義されていることを前提としています。

public class ProgramZ
{
    public List<string> x { get; set; }
}

問題は、実際にはのインデクサー プロパティ ( と呼ばれる) にインデックスを適用Program.xする必要があるときに、プロパティにインデックスを適用しようとしていることです。List<string>Item

最後に、式を呼び出すことができるようにするには、式をラムダにラップする必要があります。

これを行うコードは次のとおりです。

var expr =
    Expression.Lambda<Func<Program, string>>(
        Expression.MakeIndex(
                Expression.Property(
                    parameter,
                    typeof(Program).GetProperty("x")),
                typeof(List<string>).GetProperty("Item"),
                new[] { Expression.Constant(0) }),
        parameter);

式を呼び出す方法は次のとおりです。

var instance = new ProgramZ { x = new List<string> { "a", "b" } };

Console.WriteLine(expr.Compile().Invoke(instance));

期待どおり、このコードは を出力aします。

于 2013-02-15T08:42:29.233 に答える