3

私はC#に次のように宣言されているメソッドを持っています:

public IEnumerable<ClientEntity> Search(Func<Client, bool> searchPredicate)
{
    // Uses the search searchPredicate to perform a search.
}

このメソッドは、次のように呼び出されます。

string searchCriteria = "My Search Criteria";
bool searchOnlyActive = false;
myClientService.Search(c => c.Name.Contains(searchCriteria) && (c.Active || !searchOnlyActive));

ここで、そのメソッドの先頭にブレークポイントをスローし、イミディエイトウィンドウでsearchPredicateプロパティを確認すると、searchPredicate.Targetと入力すると、次のようになります。

{MyNamespace.ClientsService.}
    searchCriteria: "My Search Criteria"
    searchOnlyActive: false

デバッガーのように、実際に「My Search Criteria」値とそこに表示されるfalse値を取得したいのですが、Targetプロパティのタイプが「<> c__DisplayClass2」のようなものであるため、なんとかできませんでした。それがどこから来たのかわかりません。デバッガーがそれを行うので、私はそれができることを知っています、私はただ方法がわかりません。

何か案は?ありがとう!

4

1 に答える 1

4

<>c__DisplayClass2コンパイラがキャプチャコンテキストを取得するために発明したクラスです。リフレクションを使用できます。

object target = searchPredicate.Target;
if(target != null) {
    foreach(var field in target.GetType().GetFields()) {
        Console.WriteLine("{0}={1}", field.Name, field.GetValue(target));
    }
}

出力:

searchCriteria=My Search Criteria
searchOnlyActive=False

でも!匿名メソッドとキャプチャされた変数(およびコンパイラによって生成されたコンテキストクラスの観点からそれがどのように実装されているか)を理解していない限り、これで期待どおりの結果が得られるとは思いません。たとえば、コンテキスト(Targetつまりnull)がない場合や、複数のネストされたコンテキストが存在する場合があります。

また、それがあなたの意図である場合、経由の式ツリーExpression<Func<Client,bool>>ははるかに検査可能です。

于 2013-03-15T13:14:30.620 に答える