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

时间:2013-12-01 23:20:32

标签: c#

我正在使用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

2 个答案:

答案 0 :(得分:6)

您可以使用GetCustomAttributes方法过滤具有给定属性的属性:

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

true参数包括属性搜索中的继承。

答案 1 :(得分:1)

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

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次重载,但在您的情况下,我认为您只需要使用第二次重载(我们已经有一些PropertyInfo的情况)。