这可能很容易,但我真的没有得到它。
据我了解:
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
答案 0 :(得分:1)
C#中最动态的类型依赖于
IDictionary<string,object>
不一定。 ExpandoObject
确实如此,但还有很多其他的动态方式,DynamicObject
没有。
请注意,引用转换强制转换不会更改对象的类型。所以,你有这条线:
var o = (DynamicObject) webmatrixRecord;
... 变量的类型将为DynamicObject
,但这不会更改{{>> {/ em>的{em>值对象的类型1}}指的是。
对于你的其他演员,似乎它没有实现o
,所以你不能强制转换它。您可以使用DynamicObject.GetDynamicMemberNames
获取动态名称,然后使用DynamicObject.TryGetMember
获取值。但这并不理想 - 如果可能的话,我个人会尽量避免要求......