gpt4 book ai didi

c# - 通过 COM 对象的反射获取属性名称

转载 作者:可可西里 更新时间:2023-11-01 02:59:41 25 4
gpt4 key购买 nike

如何在 C# 中通过 COM 对象的反射读出所有属性名称?如果我知道名称,我就知道如何获得该属性(property)。

comObject.GetType().InvokeMember("PropertyName", System.Reflection.BindingFlags.GetProperty, null, comObject, null);

但是什么时候我想转储所有属性呢?

PropertyInfo[] properties = t.GetProperties();

这种方式不适用于 Com 对象。如果我执行 GetMembers(),我会得到这些成员:

Name: GetLifetimeService
Name: InitializeLifetimeService
Name: CreateObjRef
Name: ToString
Name: Equals
Name: GetHashCode
Name: GetType

问候克里斯

最佳答案

您获得了 __ComObject 类的成员,这是 RCW 的基础 .NET 类。

COM 对反射有一点支持,只要 COM coclass 实现 IDispatch,自动化接口(interface)。并不罕见,它是脚本语言用来进行调用的接口(interface)。 IDispatch.GetIDsOfNames() 总是被实现,但你必须预先知道成员的名字。 IDispatch.GetTypeInfo() 允许访问 coclass 的类型库,但并不总是实现。将类型库信息转换为元数据是一门不完美的艺术,这也是 .NET 希望您预先使用 Tlbimp.exe 执行此操作的核心原因。如果您想采用运行时方法,那么您可能会受益于 Tlbimp 托管版本的源代码,available here .

在构建时预先执行此操作总是最好的,您可以通过添加对类型库的引用(通常嵌入在可执行文件中)或通过自己运行 Tlbimp.exe 来实现。现在您获得了一个 .NET 互操作包装类,它具有底层 COM 协同类和接口(interface)的所有成员。在这一点上你可能不再需要反射(reflection)了:)

关于c# - 通过 COM 对象的反射获取属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com