2016-02-29 35 views
1

我需要傳入在擴展方法中使用兩次的類的屬性,以檢查此屬性中的重複值。傳遞一個類的屬性作爲參數?

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類的屬性的名稱來傳遞,然後替換PROPERTYTHATCANCHANGE。例如,Product類中的屬性可能是ProdNameProdUsers,然後我需要檢查matchedProducts列表中是否有與這些屬性具有相同值的項目。

在此先感謝!

回答

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

,並調用它是這樣的:

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

我正在一個錯誤:操作「==」不能被應用到類型和的操作數。 –

+0

從技術上講,你不是傳遞一個*表達式*(這是一個'表達式'''),而是一個getter委託人 – xanatos

+1

@DannyGoodall檢查我的編輯 - 我使用默認比較器而不是'=='運算符。 –

3

我建議在一個類型安全的方式這樣做:

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)