希望得到一点帮助。我正在传递一个集合...例如包含属性名称和值的实例。
searchLookups.Add(new SearchLookup() { SearchLookupName = "pernr", SearchLookupValue = 1022343 });
现在我想检查不同的集合是否存在相同的相同属性名称,如果存在,我希望将这些值添加到相同类型的集合中。
List<StaffMember> searchedMembers = new List<StaffMember>();
这是我正在检查属性名称和值是否存在的集合。
foreach (var staffmember in staffMembers)
{
Type t = staffmember.GetType();
PropertyInfo[] pi = t.GetProperties();
foreach (var sl in searchLookups)
{
if (pi.Where(p => p.Name == sl.SearchLookupName).Count() > 0)
{
if (pi.Where(p => p.Name == sl.SearchLookupName).First().GetValue(staffmember) == sl.SearchLookupValue)
{
searchedMembers.Add(staffMember);
}
}
}
}
目前,尽管应该有一些值,但没有任何内容添加到新集合(searchedMembers)中。
最佳答案
我猜这是因为您使用了 ==
来比较您的找到值和控制值。由于 GetValue
返回 object
,因此您正在执行引用相等。
尝试使用Equals
方法代替:
if (pi.Where(p => p.Name == sl.SearchLookupName).First().GetValue(staffmember).Equals(sl.SearchLookupValue))
顺便说一句,您可以使用 FirstOrDefault()
和 != null
检查来使您的代码更加清晰:
foreach (var sl in searchLookups)
{
var prop = pi.FirstOrDefault(p => p.Name == sl.SearchLookupName);
if(prop != null && prop.GetValue(staffmember).Equals(s1.SearchLookupValue)
{
searchedMembers.Add(staffMember);
}
}
关于c# - 尝试使用反射在集合中查找属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343782/