使用System.Dynamic来内省COM对象

4
我如何使用IDynamicMetaObjectProvider来检查COM对象?具体而言,给定任意一个COM对象,我想返回一个字典,其中键是属性名称,值是COM对象中属性的字符串值(如果属性值不是字符串,则跳过它)。
我如何在运行时获取属性名称及其值?

只需像平常一样使用反射,dyn.GetType().GetProperties()等。 - Hans Passant
@Hans,那似乎不起作用,它只返回ComObject静态属性。 - Ana Betts
在我的电脑上运行良好。确保引用类型为dynamic,而不是object。并且COM服务器实现了IDispatch。 - Hans Passant
@Hans 可能就是我的问题,它本来是动态的,但我将它转换为了对象。感谢你的提示! - Ana Betts
1个回答

1
你不能真正地这样做;对象不需要实现IDynamicMetaObjectProvider接口来提供动态功能,它只是一个允许它们在绑定过程中做出贡献的钩子。
对于这种操作,你仍然需要使用反射来获取成员和值。

System.__ComObject似乎可以做到这一点,因为VS调试器视图能够将其评估为动态对象。 - Ana Betts
也许这会提供一些额外的帮助:http://www.eggheadcafe.com/software/aspnet/30919888/introspecting-com-object-in-c.aspx - Filip Ekberg
@Paul Betts:你是在说你可以将 System.__ComObject 转换为 IDynamicMetaObjectProvider 吗? 如果是这样,那么为什么不直接在代码中进行直接转换呢?这似乎很简单可行? - casperOne
我认为是这样,但我的问题是,我如何使用IDynamicMetaObjectProvider来遍历属性列表? - Ana Betts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接