Лямбда как параметр - PullRequest
2 голосов
/ 06 ноября 2011

Я хочу создать метод, который позволяет передавать лямбда-выражение в качестве параметра. Например

List<T> Select<T>(Predicate<T> criteria)
{
     ...
}

Идея состоит в том, что поля и значения, которые произошли в выражении, могут быть восстановлены с помощью этого метода.

Примером использования может быть:

List<Contact> list = Select<Contact>(c => c.Id == 1);

Как получить поля и значения выражения

как это

string field = something here that you retrieve in this case Id
object value = something here make retrieve id here.

Извините за английский, мой родной язык - испанский. Спасибо и привет.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Пример CustomSelect с некоторыми комментариями

public class LinqAsParameter
{
    public class Dummy
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public void Test()
    {
        var dummies = new List<Dummy>
        {
            new Dummy { Name = "Jon", Age = 30 },
            new Dummy { Name = "Will", Age = 27 },
        };

        // Calling the custom select method
        IEnumerable<int> ages = dummies.CustomSelect(o => o.Age);
    }
}

// extension class
public static class IEnumerableExtenderLinqAsParameter
{
    // extension method
    public static IEnumerable<TResult> CustomSelect<TSource, TResult>(
        this IEnumerable<TSource> e
      , Expression<Func<TSource, TResult>> exp)
    {
        // from the MemberExpression you can get the Member name
        var memberExpression = exp.Body as MemberExpression;
        var field = memberExpression.Member.Name; // name
        var compiledExp = exp.Compile(); // compiling the exp to execute
                                         // and retrieve the resulting value

        // run the list an get the value for each item
        foreach (TSource item in e)
        {
            yield return compiledExp(item);
        }
    }
}

Может пригодиться сообщение Джона Скита: Переопределение LINQ для объектов: Часть 3 - «Выбор»

Некоторые ссылки из MSDN:

2 голосов
/ 06 ноября 2011

Если вы хотите использовать лямбда-выражение в качестве параметра, тип аргумента должен быть либо Expression<Func<T,TResult>>, либо Func<T,TResult> в зависимости от того, ожидаете ли вы, что выражение будет переведено в SQL или нет. Например,

public List<T> Select<T>( Expression<Func<T,bool>> selector )
{
      return db.GetTable<T>().Where( selector );
}

Обратите внимание, что не обязательно нужно оценивать или проверять выражение напрямую, если вы просто собираетесь использовать его в контексте, где требуется тип выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...