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