Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按名称筛选对象属性_C#_String_Properties - Fatal编程技术网

C# 按名称筛选对象属性

C# 按名称筛选对象属性,c#,string,properties,C#,String,Properties,我正在对各种类型进行一些简单的健全性验证。我正在进行的当前测试是检查是否填充了它们的属性。在这种情况下,填充的定义为NOTNULL,长度大于零(如果是字符串),或不等于0(如果是整数) 此测试的“棘手”部分是某些属性不受此检查的影响。现在我使用了一个巨大的if语句,它剔除了不需要检查的属性 //Gets all the properties of the currect feature. System.Reflection.PropertyInfo[] pi = t.GetProperties(

我正在对各种类型进行一些简单的健全性验证。我正在进行的当前测试是检查是否填充了它们的属性。在这种情况下,填充的定义为NOTNULL,长度大于零(如果是字符串),或不等于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.
    }                 
}
//获取当前功能的所有属性。
System.Reflection.PropertyInfo[]pi=t.GetProperties();
对于(int i=0;i
在分析时,我注意到if语句的性能实际上比反射差(不是反射速度太快)。有没有更有效的方法来过滤几种不同类型的属性

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

提前感谢。

用PropertyOne、PropertyTwo等创建一个哈希集“exactNames”,然后用ValueOne、ValueTwo等创建一个“partialNames”列表。然后:

var matchingProperties = pi.Where(exactNames.Contains(pi.Name) ||
                          partialNames.Any(name => pi.Name.Contains(name));

foreach (PropertyInfo property in matchingProperties)
{
    // Stuff
}
(奇怪的缩进只是为了避免缠绕。)


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

您的想法有助于加快我的程序,谢谢。但是,您有一些语法问题,加上您正在匹配列表中找到的项,而我需要列表中没有的项。以下是我最终使用的代码。

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

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

你可以考虑用属性来告诉你的属性需要对他们做什么。

public class MyClass {

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

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

}