我正在搜索某个属性的对象列表。我正在为很多属性重复这段代码,所以我试图让属性的读取尽可能紧凑。
以下是我目前的情况:
value = ReadValue(p => p.ProductCatalogId != 0, p => p.ProductCatalogId);
public T ReadValue<T>(Func<MyType, bool> predicate, Func<MyType, T> selector)
{
return m_settingsPages.Where(predicate).Select(selector).FirstOrDefault();
}
我总是与该类型的默认值进行比较,并始终用于不等式。我想删除谓词参数。我可以使用部分应用程序或类似技术来摆脱谓词参数吗?
伪代码:
value = ReadFirstValue(p => p.ProductCatalogId);
public T ReadFirstValue<T>(Func<MyType, T> selector) where T : IEquatable<T>
{
var predicate = selectorToPredicate(selector); //Compare with default(T) for non equality
return m_settingsPages.Where(predicate).Select(selector).FirstOrDefault();
}
selectorToPredicate将如何显示以及如何调用它?
答案 0 :(得分:2)
听起来你可以做一些简单的事情:
Func<MyType, bool> SelectorToPredicate<T>(Func<MyType, T> selector)
{
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
return x => !comparer.Equals(selector(x), default(T));
}
有一点需要注意 - 如果您的属性是字符串属性,则此将返回空字符串。这就是你想要的吗?