传递类的属性作为参数?

Dan*_*all 1 c# extension-methods

我需要传入一个在扩展方法中使用两次的类的属性,以检查此属性中的重复值.

public static class MatchedProductsExtensionMethods
{
    public static bool IdenticalValues(this List<Product> matchedProducts)
    {
        var itemToMatch = matchedProducts.First();
        if (matchedProducts.All(p => p.PROPERTYTHATCANCHANGE == itemToMatch.PROPERTYTHATCANCHANGE))
            return true;
        else
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我需要能够传递Product类的属性的名称然后替换PROPERTYTHATCANCHANGE.例如,Product类中的属性可能是ProdName或者ProdUsers然后我需要检查matchedProducts列表中是否有与这些属性具有相同值的项目.

提前致谢!

D S*_*ley 7

要传入字符串属性名称,您将不得不使用反射,这不是编译时安全且相对较慢.更类型安全的方法是传入委托而不是属性名称:

public static bool IdenticalValues<T>(this List<Product> matchedProducts, Func<Product, T> matchExpression)
{
    var itemToMatch = matchedProducts.First();
    if (matchedProducts.All(p => EqualityComparer<T>.Default.Equals(matchExpression(p), matchExpression(itemToMatch))))
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

bool allMatch = collection.IdenticalValues(i => i.PROPERTYTHATCANCHANGE );
Run Code Online (Sandbox Code Playgroud)

你甚至可以使它完全通用:

public static bool IdenticalValues<TEntity, TProperty>(this IEnumerable<TEntity> matchedEntities, Func<TEntity, TProperty> matchExpression)
{
    var itemToMatch = matchedEntities.First();
    if (matchedEntities.All(p => EqualityComparer<TProperty>.Default.Equals(matchExpression(p), matchExpression(itemToMatch))))
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)