3

这可能很容易,但我真的不明白。

据我了解:dynamicC# 依赖的大多数类型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

4

1 回答 1

1

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

不必要。ExpandoObject可以,但是还有很多其他的动态方式,DynamicObject但没有。

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

var o = (DynamicObject) webmatrixRecord; 

...变量的类型将是DynamicObject,但这不会改变 的o所指的对象的类型。

对于您的其他演员表,似乎它只是没有实现IDictionary<string, object>,因此您无法对其进行转换。您可以DynamicObject.GetDynamicMemberNames用来获取动态名称,然后DynamicObject.TryGetMember用来获取值。虽然这并不理想 - 如果可能的话,我个人会尽量避免有这个要求......

于 2013-10-18T14:01:10.343 回答