【问题标题】:Casting WebMatrix DynamicRecord or retrieving the underlying IDictionary<string,object>投射 WebMatrix DynamicRecord 或检索基础 IDictionary<string,object>
【发布时间】:2013-10-18 12:30:39
【问题描述】:

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

据我了解: C#中dynamic类型最多依赖IDictionary&lt;string,object&gt;

我用 WebMatrix.Data 做了一个峰值,我想将我的结果投射到 IDictionary&lt;string,object&gt; 但这不起作用...... WebMatrix.Data 查询返回一个IEnumerable&lt;DynamicRecord&gt; 这是我尝试投射的...

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

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# c#-4.0 dynamic casting dynamicobject


    【解决方案1】:

    C#中最动态的类型依赖IDictionary&lt;string,object&gt;

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

    请注意,引用转换转换不会更改对象的类型。那么你在哪里得到这条线:

    var o = (DynamicObject) webmatrixRecord; 
    

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

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

    【讨论】:

    • 感谢您的回复...我选择 DynamicObject 只是因为 DynamicRecord 继承自它,我认为它让我更接近:-/ 我需要一个 ExpandoObject 或 IDictionary 来自 DynamicRecord.. . 但既然你说没有演员表,我必须写点什么......
    • @silverfighter:DynamicRecord 本身是否暴露了任何东西?快速浏览后我什么也看不到 - 所以你可能需要先调用 GetDynamicMemberNames 然后再调用 TryGetMember 来构建你的字典。
    • 就开源版本 von WebMatrix.Data 而言.. 我与 GetDynamicMemberNames 和 TryGetMember 打赌...aspnetwebstack.codeplex.com/SourceControl/latest#src/…
    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多