如果枚举位于不同的 DLL 中,则无法访问它们。所以我要么使用整数值,要么创建自己的枚举。
根据定义,不可能通过后期绑定访问预定义的enums。显然,它们将在 .NET 中显示为 “整数”。当然,您可以将一些 int 转换为您已定义的 enum 或 constant,但这样的代码只是为了您的利益,并不代表 COM 库通常发布的强合约。
真的不能通过后期绑定来访问吗?如果是这样,为什么?我希望早期绑定是由 IDE 左右简化的后期绑定代码。
早期绑定使用 COM 类型库或 COM 互操作库。通过提供 C# 或 VB.NET 熟悉的类型,这些本质上是围绕 COM 类型的 .NET 包装器。有了它,您可以以语句完成的形式获得智能感知;参数帮助;和方法帮助。编译器将帮助您解决您在编译时可能犯的任何错误。只有存在类型库或 COM 互操作库时,早期绑定才有效。
后期绑定不会以智能感知的形式为您提供任何东西。没有指示哪些对象可用;有哪些方法;也不传递什么参数。您的代码可能会编译,但您仍然可能会遇到运行时错误。后期绑定不使用也不需要类型库或 COM 互操作库。
此外,术语后期绑定 意味着COM 特有的东西。它通常涉及调用IDispatch 以获取方法名称列表。我不确定 .NET 的 enumType.GetField("Bar").GetValue() 是否符合条件。
后期绑定示例
后期绑定C#代码:
// You will get no intellisense help here
var progId = "Excel.Application";
dynamic excelApp = Activator.CreateInstance(Type.GetTypeFromProgID(progId));
excelApp.Workbooks.Add = true; // VS happily lets me type all this
dynamic workSheet = excelApp.ActiveSheet; // hope this all works at runtime
是否后期绑定
这个例子不是通过带有反射的后期绑定来访问枚举吗?不同的是它只适用于同一个文件
也许,这是一种后期绑定。我可能会使用术语解耦。
COM 世界中的后期绑定一般用于以下一种或多种场景:
a) 不知道您将提前与什么交互
b) 你知道,但你无权访问任何类型库,因为它没有安装或开发人员从未创建它
c) 希望将您的应用与任何特定版本的 COM 库分离
您提供的使用enumType.GetField("Bar").GetValue(null); 的示例告诉我一些事情:
- 你知道你正在处理 Excel
- 您可以访问“类型库”的一种形式 - 一种包含定义的形式。在这种情况下,枚举常量
- 你对 Excel 有点耦合
考虑到这一点,我不确定您为什么要遵循迟到路线。你似乎采取了更难的方法。
告诉我更多