C# 检查属性是否具有特定属性?

C# 检查属性是否具有特定属性?,c#,C#,我正在使用WCF RIA服务来完成web应用程序的一些小部分;主要是填充/过滤列表(我对RIA的理解还不够透彻,无法相信我正在正确地进行服务器端验证)。我要做的一件事是获取一个列表,其中的字段具有哪种泛型类型,我的意思是,字符串是文本类型,十进制、双精度、整数是数字,等等。我使用LINQ查询来实现这一点 Fields = type.GetProperties().Where(pi => pi.PropertyType == typeof(string) && pi.GetG

我正在使用WCF RIA服务来完成web应用程序的一些小部分;主要是填充/过滤列表(我对RIA的理解还不够透彻,无法相信我正在正确地进行服务器端验证)。我要做的一件事是获取一个列表,其中的字段具有哪种泛型类型,我的意思是,字符串是文本类型,十进制、双精度、整数是数字,等等。我使用LINQ查询来实现这一点

Fields = type.GetProperties().Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null && pi.Name != "DisplayName")
                            .Select(pi => new FieldData
                            {
                                FieldName = CommonResources.AddSpacesToSentence(pi.Name, true),
                                FieldType = "Text"
                            }).....
字段
DisplayName
是列表中应该忽略的一个特殊字段,但随着该应用程序的发展,我意识到这不是一种非常可维护/可扩展/可流行的方式。我真正想知道的是
DisplayName
属性的元数据是否具有属性
[Display(AutoGenerateField=false)]

有没有办法在我的LINQ中检查

更新:

在发布这篇文章之后,我能够慢慢地解决如何做到这一点(我以前从未以这种方式处理过属性)。King King给出的答案看起来不错,而且非常通用,但我最终解决这个问题的方式不同,所以如果你对另一种方式感兴趣,下面是我的发现。我在LINQ查询中添加了以下内容:

((DisplayAttribute)Attribute.GetCustomAttribute(pi, typeof(DisplayAttribute))).GetAutoGenerateField() == false
可以使用该方法筛选具有给定属性的属性:

...
.Where(pi => pi.GetCustomAttributes(typeof(DisplayAttribute), true).Any())
...

true
参数在属性搜索中包含继承。

您可以尝试以下代码来检查属性的属性值:

public bool CheckPropertyAttribute(Type type, string property, 
                            Type attributeType, string attProp, object value)
{
    var prop = type.GetProperty(property);
    if (prop == null) return false;
    return CheckPropertyAttribute(prop, attributeType, attProp, value);
}
public bool CheckPropertyAttribute(PropertyInfo prop, Type attributeType,
                                   string attProp, object value){
   var att = prop.GetCustomAttributes(attributeType, true);
   if (att == null||!att.Any()) return false;
   var attProperty = attributeType.GetProperty(attProp);
   if (attProperty == null) return false;
   return object.Equals(attProperty.GetValue(att[0], null),value);
}
用法:

if(CheckPropertyAttribute(pi, typeof(DisplayAttribute), "AutoGenerateField", false)){
  //...
}

注意:我提供了2个重载,但在您的情况下,我认为您只需要使用第二个重载(在这种情况下,我们已经有了一些
属性info
)。

我想我知道了如何做我想做的事情,但专门针对我的情况。这看起来是一种更好的通用方法。让我测试一下,看看效果如何,谢谢!