假设我有这门课
public class Person
{
public int PhoneNumber { get; set; }
public string Name { get; set; }
}
我想编写一个方法,可以根据 Person 的属性和比较字段返回用户列表。
private List<Person> GetResult(Func<Person, object> p, string v)
{
List<Person> data = GetResultsFromDb();
return data.Where(p == v);
}
例如,如果我想获取所有名为 Mike 的人,我可以说
var result = GetResult(a => a.Name, "Mike");
或者,如果我想根据电话号码获取结果,我可以说
var result = GetResult(a => a.PhoneNumber, 123);
但是我越来越
Operator == cannot be applied to operands of type 'Expression<Func<Person, object>>' and string
最佳答案
p
的参数是代表。这种类型与 string
相比效果不佳(因此你的错误消息)。您需要调用委托(delegate)来获取值。但是,对象的返回类型对于比较而言并不是最佳的。所以你应该使你的方法通用。现在你是通用的,你不能使用相等运算符 ==
,但您可以使用 Equals
。最后你需要调用ToList
匹配方法的返回类型:
private List<Person> GetResult<T>(Func<Person, T> p, T v)
{
List<Person> data = GetResultsFromDb();
return data.Where(item => p(item).Equals(v)).ToList();
}
由于参数v
类型为T
, T
当你调用该方法时可以推断出。这意味着您可以省略类型参数,因此可以使用 GetResult(a => a.Name, "Mike")
而不是GetResult<string>(a => a.Name, "Mike")
.
一些 .NET 专业人士可能会提示,当您调用 Equals
时,您不需要该方法是通用的。 ,自 Equals
定义于 Object
。您还可以指出这样一个事实:null
的比较值将不起作用,并且 IEquatable
实现没有给予任何特殊考虑。如果您想避免所有这些投诉,您可以使用EqualityComparer
进行比较:
private List<Person> GetResult<T>(Func<Person, T> p, T v)
{
List<Person> data = GetResultsFromDb();
return data.Where(item => EqualityComparer<T>.Default.Equals(p(item), v)).ToList();
}
关于c# - 如何通过比较将 lambda 表达式传递给 where 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624373/