这可能很容易,但是我真的没有。
据我所理解:
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
最佳答案
C#中最动态的类型依赖于IDictionary<string,object>
不必要。 ExpandoObject
可以,但是还有很多其他的动态方式,而DynamicObject
则没有。
请注意,引用转换转换不会更改对象的类型。所以你在这行:
var o = (DynamicObject) webmatrixRecord;
...变量的类型将为
DynamicObject
,但这不会更改o
的值所引用的对象的类型。对于您的其他强制类型转换,似乎它只是没有实现
IDictionary<string, object>
,因此您不能强制使用它。您可以使用DynamicObject.GetDynamicMemberNames
获取动态名称,然后使用DynamicObject.TryGetMember
获取值。不过这并不理想-如果可能的话,我个人会尽量避免甚至有此要求。