0

我正在搜索某个属性的对象列表。我正在为很多属性重复此代码,因此我试图使属性的读取尽可能紧凑。

这是我目前拥有的:

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 的外观如何,我该如何称呼它?

4

1 回答 1

2

听起来你可以做一些简单的事情:

Func<MyType, bool> SelectorToPredicate<T>(Func<MyType, T> selector)
{
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    return x => !comparer.Equals(selector(x), default(T));
}

需要注意的一件事 - 如果您的属性是字符串属性,这返回空字符串。那是你要的吗?

于 2012-09-04T06:30:04.150 回答