C# λ作为参数
我想创建一个允许将lambda表达式作为参数传递的方法。比如说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
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);
}
}
}