2

我正在对各种类型进行一些简单的完整性验证。我正在进行的当前测试是检查以确保填充了它们的属性。在这种情况下,填充被定义为不为空,长度大于零(如果是字符串),或者不等于 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() 来查找属性是否包含某个值的情况。

提前致谢。

4

3 回答 3

3

使用 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
}

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

请注意,您可以缓存一组属性以在每种类型的基础上进行验证,因此您只需对每种类型进行一次此检查。

于 2008-12-05T16:09:57.860 回答
0

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

List<System.Reflection.PropertyInfo> pi = type.GetProperties().ToList();

var matchingProperties = pi.Where( prop => !PropertyExclusionSet.Contains( prop.Name )
&& !PropertiesPartialSet.Any( name => prop.Name.Contains( name ) ) );
于 2008-12-05T17:48:48.037 回答
0

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

public class MyClass {

   [CheckMe]
   public int PropertyOne { get; set; }

   [DontCheckMe]
   public int PropertyTwo { get; set; }

}
于 2008-12-05T18:04:43.013 回答