簡體   English   中英

檢查屬性是否具有特定屬性?

[英]Check if a property has a specific attribute?

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

您可以使用GetCustomAttributes方法過濾具有給定屬性的屬性:

...
.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個重載,但在您的情況下,我認為您只需要使用第二個重載(我們已經有一些PropertyInfo )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM