Lambda作为参数

时间:2011-11-06 03:22:43

标签: c# parameters lambda filtering

我想创建一个允许将lambda表达式作为参数传递的方法。例如

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 个答案:

答案 0 :(得分:3)

带有一些评论的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);
        }
    }
}

你可能会发现Jon Skeet的帖子很有用:Reimplementing LINQ to Objects: Part 3 - "Select"

来自MSDN的一些参考文献:

答案 1 :(得分:2)

如果要使用lambda表达式作为参数,则应该将参数类型设置为Expression<Func<T,TResult>>Func<T,TResult>,具体取决于您是否希望将表达式转换为SQL 。例如,

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

注意,如果您只是想在需要表达式类型的上下文中使用它,则不一定需要直接评估或检查表达式。