2010-06-06 283 views
3

是否可以從屬性內訪問父類。從自定義屬性訪問父類

例如,我想創建一個DropDownListAttribute,它可以應用於MVC中viewmodel類的屬性,然後從編輯器模板創建一個下拉列表。我遵循與Kazi Manzur Ra​​shid here類似的路線。

他將類別集合添加到viewdata中,並使用提供給該屬性的鍵值檢索它們。

我想這樣做下面,

public ExampleDropDownViewModel { 

    public IEnumerable<SelectListItem> Categories {get;set;} 

    [DropDownList("Categories")] 
    public int CategoryID { get;set; } 
} 

這個屬性將包含綁定到集合的屬性的名稱。我無法弄清楚如何訪問屬性父類的屬性。有誰知道如何做到這一點?

謝謝

回答

1

你不能從一個屬性訪問父類型。屬性是應用於類型的元數據,但你不能回頭看,並嘗試找出類型,除非你不喜歡的東西:

[MyCustomAttribute(typeof(MyClass))] 
public class MyClass { 
    /// 
} 

有了更高的反射解決方案,你實際上並沒有實現行動從屬性獲取類型,您正在做相反的事情,您從類型獲取屬性。此時,你已經有了這個類型。

1

你可以使用反射來做到這一點。執行以下步驟,你的主類:

Type type = typeof(ExampleDropDownViewModel)); 
// Get properties of your data class 
PropertyInfo[] propertyInfo = type.GetProperties(); 

foreach(PropertyInfo prop in propertyInfo) 
{ 
    // Fetch custom attributes applied to a property   
    object[] attributes = prop.GetCustomAttributes(true); 

    foreach (Attribute attribute in attributes) { 
     // we are only interested in DropDownList Attributes.. 
     if (attribute is DropDownListAttribute) { 
    DropDownListAttribute dropdownAttrib = (DropDownListAttribute)attribute; 
     Console.WriteLine("table set in attribute: " + dropdownAttrib.myTable); 
     } 
    } 
} 
+0

感謝您的回覆。這段代碼實際去哪裏?我看不出如何將這一點整合到Kazi建議的元數據提供者中。此外,您似乎沒有反映實例,因此如何從Categories屬性獲取集合。 – madcapnmckay 2010-06-06 17:06:53

+0

請注意,自定義屬性是對象的裝飾器,其信息將添加到編譯器生成的對象的元數據中。所以基本上,當您使用DropDownList屬性修飾類別屬性時,您可以在渲染模板時確定它是否應呈現爲下拉列表。 – 2010-06-06 21:27:21