这可能很容易,但是我真的没有。

据我所理解:
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获取值。不过这并不理想-如果可能的话,我个人会尽量避免甚至有此要求。

10-08 01:13