1

厳密に型指定されたプロパティをメソッドに渡し、このプロパティ名を mhy コレクションの文字列として使用したいので、厳密に型指定されたプロパティを渡すことができるコードをいくつか見つけました。

public static void Add<TObject, TProperty>(this NameValueCollection collection, Expression<Func<TObject, TProperty>> expression, string value)
{
    var member = expression.Body as MemberExpression;

    collection.Add(member.Member.Name, value);
}

これは機能し、私が望むことを行いますが、これが正確にどのように機能するのか疑問に思っていました。私が興味を持っている部分はAdd<Tobject, TProperty>、式と組み合わせたメソッド ( )のジェネリック引数ですFunc。誰かがこれがどのように機能するかを説明できますか? そして、なぜこのメソッドを次のように呼び出すことができるのcollection.Add((MyObject m) => m.FullName, "Martijn")ですか? を使用する必要がないのはなぜAdd<MyObject, ???>(m => m.FullName, "Martijn")ですか?

更新:メソッドをこれにリファクタリングしました:

public static void Add<TObject>(this NameValueCollection collection, Expression<Func<TObject, string>> expression, string value)
{
    var member = expression.Body as MemberExpression;

    collection.Add(member.Member.Name, value);
}
4

1 に答える 1

1

Expression<T>delegate-type の署名を持つ式ツリーTです。式ツリーは複雑ですが、基本的には、これは操作であるデリゲートではなく、操作を記述するオブジェクト モデルであり、それがどのように構成されているかを調べることができます。

したがって、は、パラメーターExpression<Func<TObject,TProperty>>を受け入れて結果を返すものを表す式ツリーです。TObjectTProperty

<MyObject, ???>手動で伝える必要がない理由については、それはジェネリック型の推論であり、正常です。一般的なメソッドが与えられた場合、次のように言います。

void Foo<T>(T bar);

次のように呼び出すことができます。

Foo<string>("abc");

ただし、次を使用することもできます。

Foo("abc");

次に、コンパイラはパラメーターを検査して、すべてのジェネリック型パラメーターを解決できるかどうかを確認します。この場合、 は"abc"であり、 であることを固定しstringます。それらすべてを解決できる場合は、それらを指定する必要はありません。Tstring

あなたの例ではTObject、ラムダが明示的にMyObject, via を受け取るため(MyObject) mTPropertyが固定され、(おそらく) aを返すstringため、が(おそらく) a に固定されます。すべてのジェネリック型パラメーターは自動的に解決されるため、手動で指定する必要はありません。m.FullNamestring<...>

ジェネリック型の推論は、ジェネリックメソッド(パラメーターを介して) にのみ適用され、ジェネリックには適用されないことに注意してください。

于 2012-08-23T06:32:38.633 に答える