转换WebMatrix DynamicRecord或检索基础IDictionary <string,object> </string,object>

时间:2013-10-18 12:30:39

标签: c# c#-4.0 dynamic casting dynamicobject

这可能很容易,但我真的没有得到它。

据我了解: C#中的大多数dynamic类型依赖于IDictionary<string,object>

我用WebMatrix.Data做了一个高峰,我想将结果转换为IDictionary<string,object>,但这不起作用...... WebMatrix.Data查询返回IEnumerable<DynamicRecord>这是我试图投射的......

这是我的天真代码......

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 个答案:

答案 0 :(得分:1)

  

C#中最动态的类型依赖于IDictionary<string,object>

不一定。 ExpandoObject确实如此,但还有很多其他的动态方式,DynamicObject没有。

请注意,引用转换强制转换不会更改对象的类型。所以,你有这条线:

var o = (DynamicObject) webmatrixRecord; 

... 变量的类型将为DynamicObject,但这不会更改{{>> {/ em>的{em>值对象的类型1}}指的是。

对于你的其他演员,似乎它没有实现o,所以你不能强制转换它。您可以使用DynamicObject.GetDynamicMemberNames获取动态名称,然后使用DynamicObject.TryGetMember获取值。但这并不理想 - 如果可能的话,我个人会尽量避免要求......