将 class 的 属性 作为参数传递?
Pass a property of a class as a parameter?
我需要传入在扩展方法中使用两次的 class 的 属性,以检查此 属性 中的重复值。
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
class 的 属性 的名称,然后用它替换 PROPERTYTHATCANCHANGE
。例如,Product
class 中的属性可能是 ProdName
或 ProdUsers
然后我需要检查 matchedProducts
中是否有项目这些属性具有相同值的列表。
提前致谢!
要传递字符串 属性 名称,您将不得不使用反射,它在编译时不安全并且速度相对较慢。一种类型更安全的方法是传入 delegate 而不是 属性 名称:
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)
我需要传入在扩展方法中使用两次的 class 的 属性,以检查此 属性 中的重复值。
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
class 的 属性 的名称,然后用它替换 PROPERTYTHATCANCHANGE
。例如,Product
class 中的属性可能是 ProdName
或 ProdUsers
然后我需要检查 matchedProducts
中是否有项目这些属性具有相同值的列表。
提前致谢!
要传递字符串 属性 名称,您将不得不使用反射,它在编译时不安全并且速度相对较慢。一种类型更安全的方法是传入 delegate 而不是 属性 名称:
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)