2013-10-18 43 views
3

這可能是一個容易的,但我真的沒有得到它。鑄造WebMatrix DynamicRecord或檢索底層的IDictionary <string,object>

據我的理解: 最dynamic類型的插件C#依靠IDictionary<string,object>

我做了一個WebMatrix.Data秒殺,我想我的結果轉換爲IDictionary<string,object>但這並不工作... WebMatrix.Data查詢返回IEnumerable<DynamicRecord>這是我嘗試投...

這裏是我的naiv代碼...

var o = (DynamicObject) webmatrixRecord; // No Exception but o is still DynamicRecord 

var o = (IDictionary<string,object>) webmatrixRecord; // Runtime Binder Exception 

var o = ((IDictionary<string,object>)((DynamicRecord)webmatrixRecord)) // InvalidCastException; 

那麼什麼是投射動態物體的正確方法?

WebMatrix.DynamicRecord:http://msdn.microsoft.com/de-de/library/webmatrix.data.dynamicrecord(v=vs.111).aspx

Dynamics.DynamicRecord:http://msdn.microsoft.com/de-de/library/system.dynamic.dynamicobject(v=vs.111).aspx

回答

1

最具活力的各類插件C#依靠IDictionary<string,object>

不一定。 ExpandoObject呢,但有很多其他的方式是動態的,而DynamicObject沒有。

請注意,引用轉換轉換不會更改對象的類型。那麼,你有這樣一行:

var o = (DynamicObject) webmatrixRecord; 

...的變量的類型將是DynamicObject,但這並不改變對象的o指型。

爲其他類型轉換,似乎它只是沒有實現IDictionary<string, object>,所以你不能投給它。您可以使用DynamicObject.GetDynamicMemberNames獲取動態名稱,然後使用DynamicObject.TryGetMember來獲取值。它的效果並不理想,但 - 我個人儘量避免甚至有要求,如果可能的話...

+0

感謝您的答覆。我選用DynamicObject只是因爲DynamicRecord從它繼承,我認爲這使我更接近: -/ 我需要從一個DynamicRecord或ExpandoObject和IDictionary的<字符串,對象> ...但因爲ü說,沒有投我寫的東西... – silverfighter

+0

@silverfighter:是否'DynamicRecord'本身暴露出什麼?快速瀏覽後我什麼也看不到 - 所以你可能需要調用'GetDynamicMemberNames'然後'TryGetMember'來建立你的字典。 –

+0

至於開源版本馮WebMatrix.Data說..我採取與GetDynamicMemberNames您的賭注和TryGetMember ... http://aspnetwebstack.codeplex.com/SourceControl/latest#src/WebMatrix.Data/DynamicRecord.cs – silverfighter

相關問題