2008-12-24 211 views
18

我試圖通過指定一個提供的數據行的列是該屬性的值,如下面上的類屬性的屬性來建立一個對象:C#通過與屬性反射設置屬性值

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

在基礎對象建立()方法中,我越來越對這些屬性設置的屬性值

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

然而,在這一點上,我意識到在我的知識的限制。

首先,我似乎沒有找回正確的屬性。

如何通過反射來設置這些屬性,現在我有屬性了?我在做什麼/思考一些根本不正確的事情?

回答

38

有幾個不同的問題在這裏

  • typeof(MyClass).GetCustomAttributes(bool)(或GetType().GetCustomAttributes(bool))返回類本身,而不是成員的屬性的屬性。您將不得不調用typeof(MyClass).GetProperties()以獲取課程中的屬性列表,然後檢查它們中的每一個。

  • 一旦你得到的財產,我認爲你應該使用Attribute.GetCustomAttribute()而不是MemberInfo.GetGustomAttributes(),因爲你完全知道你正在尋找什麼屬性。

這裏有一個小的代碼片段,以幫助您開始:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

編輯:不要忘了,只Type.GetProperties()默認返回公共屬性。您將不得不使用Type.GetProperties(BindingFlags)以獲得其他類型的屬性。

+0

我會給你一個測試,讓你知道,雖然看起來邏輯 – johnc 2008-12-24 01:59:01