c# - 尝试使用反射在集合中查找属性值

标签 c#

希望得到一点帮助。我正在传递一个集合...例如包含属性名称和值的实例。

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/

相关文章:

c# - 如何在 WinDBG 中查看托管异常详细信息?

c# - 用于 session 超时的javascript倒数计时器

javascript - 如何在 JINT Javascript 端创建计时器

c# - 使用反射的内部构造函数实例化类型

c# - 文本选择交集算法

c# - 使用 TryParse 作为 bool

c# - 位移和数据解释

c# - ASP.NET MVC 3 : Multiple Html. RenderAction() 问题

c# - 为什么 string Method(Object object) 可能与 Func<Object, string> 委托(delegate)类型不匹配?

c# - C#虚拟方法