8

Func<>C# で Lambdaの渡されたパラメーターの値を取得する方法

IEnumerable<AccountSummary> _data = await accountRepo.GetAsync();
string _query = "1011";
Accounts = _data.Filter(p => p.AccountNumber == _query);

これが私の拡張メソッドです

public static ObservableCollection<T> Filter<T>(this IEnumerable<T> collection, Func<T, bool> predicate)
{
        string _target = predicate.Target.ToString();
        // i want to get the value of query here.. , i expect "1011"

        throw new NotImplementedException();
}

_targetに割り当てられた Filter 拡張メソッド内のqueryの値を取得したい

4

4 に答える 4

12

パラメータを取得したい場合は、式を渡す必要があります。「Func」を渡すと、コンパイルされたラムダが渡されるため、式ツリーにアクセスできなくなります。

public static class FilterStatic
{
    // passing expression, accessing value
    public static IEnumerable<T> Filter<T>(this IEnumerable<T> collection, Expression<Func<T, bool>> predicate)
    {
        var binExpr = predicate.Body as BinaryExpression;
        var value = binExpr.Right;

        var func = predicate.Compile();
        return collection.Where(func);
    }

    // passing Func
    public static IEnumerable<T> Filter2<T>(this IEnumerable<T> collection, Func<T, bool> predicate)
    {
        return collection.Where(predicate);
    }
}

試験方法

var accountList = new List<Account>
{
    new Account { Name = "Acc1" },
    new Account { Name = "Acc2" },
    new Account { Name = "Acc3" },
};
var result = accountList.Filter(p => p.Name == "Acc2");  // passing expression
var result2 = accountList.Filter2(p => p.Name == "Acc2");  // passing function
于 2013-07-17T07:32:00.957 に答える
1

したがって、述語を渡すFunc<T,bool>代わりに式ツリーを渡しますExpression<Func<T,bool>

次に、それがどのタイプの式であるかを調べて、そのコンポーネント部分を取得できます。メソッドの呼び出し方法には影響しませんが、ラムダを渡すことができます。

于 2013-07-17T06:38:10.703 に答える
0

私は本当にあなたがそれを行うことができるとは思わない. 次の状況を確認します。

あなたpredicateは に設定されているFunc<T, bool> predicateので、次のように呼び出すことができます:

Accounts = _data.Filter(p => true);

そのような電話から何を得たいですか?

(p) => true入力として受け取り、値を返すFunc<T, bool>ため、 を満たします。Tbool

于 2013-07-17T06:31:35.220 に答える