gpt4 book ai didi

c# - 对 COM Interop 对象的反射(reflection)

转载 作者:太空狗 更新时间:2023-10-29 20:46:50 27 4
gpt4 key购买 nike

尝试为 Microsoft Office 对象创建到 POCO 的映射器并找到这个

// doesn't work
// returns an empty array where o is a RCW on an office object
foreach(var pi in o.GetType().GetProperties() )
tgt.SetValue(rc, pi.GetValue(o, null));

所以不得不求助于此

foreach(var field in tgt.GetFields() ){
var pv = o.InvokeMember(field.Name, System.Reflection.BindingFlags.GetProperty, null, o, null);
i.SetValue(rc, pv);
}

目前有效,但想知道为什么 RCW.GetProperties() 在这里不起作用?

最佳答案

在撰写本文时,其他两个答案是正确的,但他们错过了一个重要的机会来解释 COM 对象的后期绑定(bind)在 .NET 类型系统方面的表现。 当您调用 GetType在 COM 对象上,返回值为 __ComObject内部类型,而不是您在编写互操作代码时通常使用的 COM 接口(interface)类型。 您可以在调试器中看到它,或者使用类似 Console.WriteLine(o.GetType().Name); 的一些代码.

__ComObject类型没有属性;这就是为什么当你调用 o.GetType().GetProperties() 时得到一个空数组的原因. (至少生活中的某些事情是有意义的!)

如果反编译InvokeMember方法,您会发现它对 COM 对象有特殊处理,将调用委托(delegate)给内部 native 方法。对于“常规”.NET 对象,该方法使用“常规”.NET 反射,检索适当的 MemberInfo对于请求的成员,并调用它。

可以接口(interface) 类型上使用.NET 反射。例如,如果您知道对象是 Excel Worksheet , 你可以使用 typeof(Worksheet).GetProperties() ,并使用结果 PropertyInfo与您的对象的实例。但是,如果您在编译时不知道对象的类型,则需要调用 GetType() ,如您的示例代码中所示。在这种情况下,您只能使用 InvokeMember .

关于c# - 对 COM Interop 对象的反射(reflection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9735394/

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