Search code examples
c#lambdafunc

Func<> getting the parameter info


How to get the value of the passed parameter of the Func<> Lambda in C#

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

and this is my extension method

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();
}

I want to get the value of query inside the Filter extension method assigned to _target


Solution

  • If you want to get the parameter you will have to pass expression. By passing a "Func" you will pass the compiled lambda, so you cannot access the expression tree any more.

    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);
        }
    }
    

    Testmethod

    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