2011-04-11 78 views
2

我想實現一個簡單的API,用戶可以通過屬性屬性來指定對象屬性的排序。如何檢索C#中屬性的屬性?

是這樣的:

[Sorting(SortOrder=0)] 
public string Id { get; set; } 

在基本ToString()方法,然後我使用反射來從物體拉的屬性。

Type currentType = this.GetType(); 
PropertyInfo[] propertyInfoArray = currentType.GetProperties(BindingFlags.Public); 
Array.Sort(propertyInfoArray, this.comparer); 

我已經使用IComparer接口做的Array.Sort寫了一個自定義類,但一旦我在那裏就是我會被卡住試圖檢索[排序]屬性。目前,我有一些看起來像這樣:

PropertyInfo xInfo = (PropertyInfo)x; 
PropertyInfo yInfo = (PropertyInfo)y; 

我想我可以使用xInfo.Attributes,但PropertyAttributes類並沒有做什麼,我需要做的。有沒有人有任何指導如何檢索[排序]屬性?我已經環顧了很多人,但是在編程時如何超載屬性這個詞,我不斷收到大量虛假的線索和死衚衕。

回答

3

使用MemberInfo.GetCustomAttributes

System.Reflection.MemberInfo info = typeof(Student).GetMembers() 
                .First(p => p.Name== "Id"); 
object[] attributes = info.GetCustomAttributes(true); 

編輯:

要獲得本身的價值,看看this answer

祝你好運!

0

您需要使用GetCustomAttributes方法。

2

試試這個:

System.Reflection.MemberInfo info = typeof(MyClass); 
object[] attributes = info.GetCustomAttributes(true); 
+0

這將檢索類上的任何自定義屬性,而不是屬性上的SortingAttribute。 – Greg 2011-04-11 17:33:49

+0

正確的是,同樣的想法雖然... propertyInfo.GetCustomAttributes(布爾); – BrandonZeider 2011-04-11 17:47:41

1

GetCustomAttributes是你將要使用的方法。

SortingAttribute[] xAttributes = (SortingAttribute[])xInfo.GetCustomAttributes(typeof(SortingAttribute), true); 
1

我通常使用一套擴展的方法是:

public TAttribute GetAttribute<TAttribute>(this ICustomAttributeProvider provider, bool inherit = false) 
    where TAttribute : Attribute 
{ 
    return GetAttributes<TAttribute>(provider, inherit).FirstOrDefault(); 
} 

public IEnumerable<TAttribute> GetAttributes<TAttribute>(this ICustomAttributeProvider provider, bool inherit = false) 
    where TAttribute : Attribute 
{ 
    return provider.GetCustomAttributes(typeof(TAttribute), inherit).Cast<TAttribute>() 
} 

我可以稱其爲:

var attrib = prop.GetAttribute<SortingAttribute>(false); 

從設計的角度來看,雖然,我會確保你只檢查這些作爲反思的特性並不總是很快。如果您正在比較多個對象,則可能會發現使用反射會成爲一個瓶頸。