【问题标题】:Filtering an Objects Properties by Name按名称过滤对象属性
【发布时间】:2010-09-25 13:14:36
【问题描述】:

我正在对各种类型进行一些简单的健全性验证。我正在进行的当前测试是检查以确保填充了它们的属性。在这种情况下,填充被定义为不为空,长度大于零(如果是字符串),或者不等于 0(如果是整数)。

此测试的“棘手”部分是某些属性不受此检查的影响。现在我使用一个巨大的 if 语句来清除不需要检查的属性。

//Gets all the properties of the currect feature.
System.Reflection.PropertyInfo[] pi = t.GetProperties();

for(int i = 0; i < pi.Length; i++)
{
    if(!pi[i].Name.Equals("PropertyOne") 
    && !pi[i].Name.Equals("PropertyTwo") 
    && !pi[i].Name.Equals("PropertyThree") 
            //... repeat a bunch more times
    && !pi[i].Name.IndexOf("ValueOne") != -1 
    && !pi[i].Name.IndexOf("ValueTwo") != -1 
            //... repeat a bunch more times
    {
        //Perform the validation check.
    }                 
}

在进行分析时,我注意到 if 语句的性能实际上比反射差(并不是说反射非常快)。有没有更有效的方法来过滤几种不同类型的属性?

我考虑过一个庞大的正则表达式,但我不确定如何格式化它,而且考虑到它的大小,它可能不可读。我也考虑过将值存储在 List 中,然后使用 Linq,但我不确定如何处理使用 String.IndexOf() 来查找属性是否包含某个值的情况。

提前致谢。

【问题讨论】:

    标签: c# string properties


    【解决方案1】:

    使用 PropertyOne、PropertyTwo 等创建一个 HashSet “exactNames”,然后使用 ValueOne、ValueTwo 等创建一个 List “partialNames”。然后:

    var matchingProperties = pi.Where(exactNames.Contains(pi.Name) ||
                              partialNames.Any(name => pi.Name.Contains(name));
    
    foreach (PropertyInfo property in matchingProperties)
    {
        // Stuff
    }
    

    (奇怪的缩进只是为了避免换行。)

    请注意,您可以缓存属性集以针对每种类型进行验证,因此您只需对每种类型进行一次此检查。

    【讨论】:

      【解决方案2】:

      您的想法有助于加快我的程序,谢谢。但是,您遇到了一些语法问题,而且您正在匹配列表中的项目,而我需要不在列表中的项目。这是我最终使用的代码。

      List<System.Reflection.PropertyInfo> pi = type.GetProperties().ToList();
      
      var matchingProperties = pi.Where( prop => !PropertyExclusionSet.Contains( prop.Name )
      && !PropertiesPartialSet.Any( name => prop.Name.Contains( name ) ) );
      

      【讨论】:

        【解决方案3】:

        您可以考虑使用属性来装饰您的属性,这些属性告诉您需要对它们执行什么操作。

        public class MyClass {
        
           [CheckMe]
           public int PropertyOne { get; set; }
        
           [DontCheckMe]
           public int PropertyTwo { get; set; }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-21
          • 2017-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-19
          • 2021-10-23
          相关资源
          最近更新 更多