2010-06-04 24 views
47

試圖讓我的頭部繞過所有這些動態的東西。對不起,如果這個問題很愚蠢,沒有經驗在這個領域。只是在探索c#4時,將一個未知(在設計時間)的屬性添加到ExpandoObject中。

如果我有一個ExpandoObject並希望在運行時向它添加公共屬性(使用get和set),我該如何去做呢?

例如,我有一個documentTemplate和一個文檔,它有一個指向documentTemplate的屬性。這個文檔模板有一些標籤標題(例如在學生中開發的功能),這些標題在製作文檔時應該加以說明(例如濃度,記憶等)。因此,只要在文檔中設置了模板,我想要創建一個類,該模板具有與模板中標記標題相同名稱的屬性,然後使用某個UI元素(如PropertyGrid),我可以讓用戶根據標籤標題填寫標籤值。

感謝您的閱讀!

+4

只是想補充一點,我讀了ExpandoObject上的這篇文章的死樹版本:http://msdn.microsoft.com/en-us/magazine/ff796227.aspx不知道它是否回答你的問題,但它對我來說是一個偉大的勝利。 – Yoopergeek 2010-08-05 18:37:56

回答

92

我想知道有可能將成員添加到「對飛」的一類,並與該樣品上來:

using System; 
using System.Collections.Generic; 
using System.Dynamic; 

class Program 
{ 
    static void Main() 
    { 
     dynamic expando = new ExpandoObject(); 
     var p = expando as IDictionary<String, object>; 

     p["A"] = "New val 1"; 
     p["B"] = "New val 2"; 

     Console.WriteLine(expando.A); 
     Console.WriteLine(expando.B); 
    } 
} 

此代碼段的一點是,成員A和B被定義爲通過ExpandoObject的IDictionary接口添加和添加的字符串文字(硬編碼/字符串化)。我們通過直接訪問它們並輸出到控制檯來測試密鑰的存在和值(並驗證概念)。

+0

無法將[]的索引用於'System.Dynamic.ExpandoObject'類型的表達式。有任何想法嗎? – 2014-02-03 21:08:15

+0

@JasonFoglia:是的。請將其作爲問題發佈,並顯示一些代碼,包括輸入和預期輸出。我們只能猜測評論可能會發生什麼...... – 2014-02-04 04:52:41

3

是的,ExpandoObject的設計非常強大,可以動態地將屬性添加到「屬性包」中。然而,不支持給予這樣一個屬性吸氣劑和固定劑的概念。如果你仔細想一想,也許這很清楚:如果你已經知道吸氣和吸氣裝置應該做什麼,它就不再是一個動態屬性了。您可以得到的最接近的是實現INotifyPropertyChanged事件,以便您可以檢測到更改。一些示例代碼:

using System; 
using System.Dynamic; 
using System.ComponentModel; 

class Program { 
    static void Main(string[] args) { 
    dynamic obj = new ExpandoObject(); 
    obj.test = 42;  // Add a property 
    Console.WriteLine(obj.test); 

    var inpc = (INotifyPropertyChanged)obj; 
    inpc.PropertyChanged += inpc_PropertyChanged; 
    obj.test = "foo"; 
    Console.ReadLine(); 
    } 

    static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e) { 
    Console.WriteLine("'{0}' property changed", e.PropertyName); 
    } 

} 
+0

感謝您的解釋和編碼Hans。 但是,我的查詢稍有不同。我想知道是否可以在運行時添加「test」屬性?我的意思是我們甚至不知道設計時的財產名稱。類似於:obj.SetProperty(stringVariable)= anotherStringVariable。 – virtualmic 2010-06-04 17:23:49

+0

呃,沒有。你爲什麼不簡單地使用Dictionary ? – 2010-06-04 17:32:26

+0

因此,我可以輕鬆地綁定到Windows窗體UI – virtualmic 2010-06-05 03:15:11

4

這是可能的委託屬性添加到ExpandoObject,然後採取行動(幾乎)一樣的方法。例如,

dynamic obj = new ExpandoObject(); 
obj.GetDocumentTemplate =() => { ... }; 
... 
obj.GetDocumentTemplate(); // invokes delegate 
2

我剛剛發現了這個有趣的事實:XAML綁定到ExpandoObject還會創建綁定試圖訪問的屬性

我仍然需要更多的創造力來找出這可能是有益的。在UI上創建動態對象?聽起來很酷:D我會嘗試一些東西。

相關問題