通过Reflection

时间:2016-07-05 22:11:05

标签: c# .net reflection com

我正在使用COM对象,我需要能够在运行时通过Reflection搜索属性和方法,并根据与COM对象结构大致匹配的输入字符串调用它们。 / p>

我目前正在使用递归算法在运行时使用obj.GetType().InvokeMember()遍历COM对象的属性,但这仅在我提供 exact 属性和方法名称,但并非总是如此。示例:

" ALPha.BETa.GAMma&#34?; - > var gamma = comObj.ALPha.BETa.GAMma;
" ALP.BET.GAM&#34?; - > var gamma = comObj.ALPha.BETa.GAMma;
" ALP.BET.GAM 200" - > comObj.ALPha.BETa.GAMma = 200;
" ALPha.DELta" - > comObj.ALPha.DELta();

(如果有人熟悉SCPI,这就是我实际使用的 - 尝试动态转换SCPI字符串,以便在运行时调用COM对象的API)

迷路观察:

  • typeof(IComObject).GetProperties()只返回之前在运行时评估过的对我来说无用的属性。
  • Intellisense完全可用于COM对象上的所有属性和方法。
  • 调试程序在运行时将comObj的类型显示为System.__ComObject
  • 我已尝试在COM类型库exe上运行Tlbimp.exe以生成互操作程序集,但我在使用GetProperties()时看到的结果与之前相同。
  • COM对象上至少有200个属性和方法,所以我无法手动构建映射。

1 个答案:

答案 0 :(得分:1)

要扩展@HansPassant评论,COM不会做反思。后期绑定COM(通过IDispatch)通过精确的字符串匹配完成。可能你最好的办法是自己解码类型库(我以this tool开头)并构建从字符串到方法和属性的手动映射。 (是的,您需要手动重新实现反射。)