C# λ作为参数

C# λ作为参数,c#,parameters,lambda,filtering,C#,Parameters,Lambda,Filtering,我想创建一个允许将lambda表达式作为参数传递的方法。比如说 List<T> Select<T>(Predicate<T> criteria) { ... } 对不起英语,我的母语是西班牙语。谢谢大家,大家好。如果希望使用lambda表达式作为参数,则参数类型应为表达式或Func,具体取决于您是否希望将表达式转换为SQL。比如说, public List<T> Select<T>( Expression<Func&l

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

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

对不起英语,我的母语是西班牙语。谢谢大家,大家好。

如果希望使用lambda表达式作为参数,则参数类型应为
表达式
Func
,具体取决于您是否希望将表达式转换为SQL。比如说,

public List<T> Select<T>( Expression<Func<T,bool>> selector )
{
      return db.GetTable<T>().Where( selector );
}
公共列表选择(表达式选择器)
{
返回db.GetTable().Where(选择器);
}

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

一个带有一些注释的
自定义选择的示例

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);
        }
    }
}
公共类LinqAsParameter
{
公共类虚拟
{
公共字符串名称{get;set;}
公共整数{get;set;}
}
公开无效测试()
{
var dummies=新列表
{
新的虚拟对象{Name=“Jon”,年龄=30},
新的虚拟对象{Name=“Will”,年龄=27},
};
//调用自定义选择方法
IEnumerable ages=dummies.CustomSelect(o=>o.Age);
}
}
//扩展类
公共静态类IEnumerableExtenderLinqAsParameter
{
//扩展方法
公共静态IEnumerable自定义选择(
这是一本数不清的书
,表达式exp)
{
//从MemberExpression可以获得成员名称
var memberExpression=将主体作为memberExpression;
var field=memberExpression.Member.Name;//Name
var compiledExp=exp.Compile();//编译要执行的exp
//并检索结果值
//运行列表并获取每个项目的值
foreach(e中的TSource项)
{
收益率回报率(项目);
}
}
}
你可能会发现Jon Skeet的帖子很有用:

MSDN中的一些参考资料:


您的问题的答案将取决于语言。您真的应该告诉我们您使用的是什么语言,并为其添加标记。
public List<T> Select<T>( Expression<Func<T,bool>> selector )
{
      return db.GetTable<T>().Where( selector );
}
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);
        }
    }
}