繁体   English   中英

传递类的属性作为参数?

[英]Pass a property of a class as a parameter?

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

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;
    }
}

因此,我需要能够传递Product类的属性的Product ,然后替换PROPERTYTHATCANCHANGE 例如, Product类中的属性可以是ProdNameProdUsers ,然后我需要检查是否在matchedProducts列表中是否有这些属性具有相同值的项目。

提前致谢!

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

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;
}

并这样称呼它:

bool allMatch = collection.IdenticalValues(i => i.PROPERTYTHATCANCHANGE );

您甚至可以使其完全通用:

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;
}

我建议以类型安全的方式执行此操作:

public static bool IdenticalValues<T>(this List<Product> matchedProducts, Func<Product, T> selector)
{
    var itemToMatch = matchedProducts.First();
    if (matchedProducts.All(p => selector(p) == selector(p)))
        return true;
    else
        return false;
}

然后像这样称呼它

matchesProducts.IdenticalValues(p => p.SomeProperty)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM