2012-03-28 89 views
0

我正在尋找一種方法來在運行時更改/添加給定類的屬性的訪問器。 示例代碼波紋管,在類的.ctor上運行,我想要達到的是將'TheSetMethod'添加到'設置'每個'字段'的訪問器,以便通過在運行時更改字段。 供參考:這背後有一個實現約束,這使得我這樣做,而不是使用標準的「get; set;」祖先,所以我不能'得到;設定';'在設計時間。如何在運行時更改屬性訪問器

public string field1; 

    .ctor() 
    { 
     Type typeWebConfig = this.GetType(); 
     MemberInfo[] Fields = typeWebConfig.GetMembers(BindingFlags.Public | 
           BindingFlags.Instance); 
     foreach(MemberInfo member in Fields) 
      if(member.MemberType == MemberTypes.Field) 
      { 
       FieldInfo field = (FieldInfo)member; 
       //add a delegate method to field's 'SET' 
      } 
    } 

    void TheSetMethod(string propName) 
    { 
    } 

任何幫助將不勝感激。 乾杯

+3

您是否將C#與動態語言混淆? – 2012-03-28 23:52:15

+1

所以如果一個類使用另一個類,並且突然使用的類改變了它的訪問器,第一個類如何處理它? – 2012-03-28 23:52:50

+0

感謝您的意見,但我真的很感激,如果你真的幫助:) – Afshin 2012-03-29 00:07:43

回答

0

您可以實現自定義DynamicObject類型來手動處理訪問器。這隻會在.NET 4+中起作用。

+0

謝謝M.Babcok,唯一阻止我使用DynamicObject的東西(雖然它確實有幫助),但我們對設計時間並不瞭解,這非常重要。除非我沒有得到你的意思? – Afshin 2012-03-29 00:10:41

+1

你是對的,這將失去intellisense,因爲你的實例需要通過'dynamic'訪問。雖然我似乎記得有一個VS擴展可以使intellisense工作(我不記得哪一個不幸)。 – 2012-03-29 00:22:26

-1

爲什麼不只是將代碼添加到setter開始,然後使用變量來確定代碼是否應該執行?在我看來,這聽起來像是一個糟糕的設計,因爲製作setter的「Dynamic」似乎也不能很好地進行測試。

+0

簡單的答案是「設計約束」。 – Afshin 2012-03-29 05:12:40

相關問題