c# dynamic和ExpandoObject

returnTrue999發表於2019-01-31

這兩個經常是組合出現的,dynamic類似於object,區別在於編譯階段不檢查,參考下圖:

這個圖很一目瞭然了,使用object是編譯不通過的。這就決定了它的使用場景是小眾的,不可以大面積使用,不然維護起來太麻煩了。比如你有一個List<Object>集合,裡面放了兩個類A和B,它們都有一個方法叫GetName(),那麼你就可以不用強制轉換了,直接使用,如下圖,上面的是傳統做法,下面的是使用dynamic的做法:

這裡面我還用到了c#7.0的一個新特性,叫模式匹配,有興趣可以自己研究下官方文件

下面我說下ExpandoObject。這個就相當於一個動態類,它有什麼屬性,可以在程式碼裡面隨意擴充套件,而且它還實現了INotifyPropertyChanged,也就是如果你給它設定了一個屬性Name,當你在以後的操作中變更了Name的值之後,它會通知前端。具體可以看下官方文件https://docs.microsoft.com/en-us/dotnet/api/System.Dynamic.ExpandoObject?view=netframework-4.7.2

如下圖:

這裡我提一個它的應用場景:datagrid表格類控制元件行列置換。有個學生表,裡面包含兩個欄位,一個是學生姓名,一個是學生考試分數。如果正常的放到前端顯示,也就是垂直顯示,應該是如下圖:

現在我要求顯示成這樣:

由於人數是不固定的,所以列應該是動態生成的,同時,當某個學生的分數被更新了,應該通知前端,橫向顯示,也就是每多一個學生,便多了一個屬性,然後給datagrid建立一個列,並且把這列繫結到這個屬性。具體的做法就不寫了,有興趣的可以深究下。

相關文章