我想创建一个允许将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.
对不起英语,我的母语是西班牙语。谢谢你和问候。
答案 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 );
}
注意,如果您只是想在需要表达式类型的上下文中使用它,则不一定需要直接评估或检查表达式。