是否可以确定两个对象是否都实现了一个在编译时未指定的公共接口?
Is it possible to determine if two objects both implement a common interface which is not specified at compile time?
给定 Object1 和 Object2,是否有任何技术可以确定它们是否都实现了公共接口?如果接口在编译时已知(使用 typeof ... is [known interface])没问题,但如果在编译时未指定接口怎么办?
具体用例是实现强类型集合对象。如果 Object2 与 Object1 共享一个公共接口,我只想添加它。 Typename 不起作用,因为它 returns 底层对象类型,我可能有两个不同的对象,每个对象都实现 ISomeInterface 但在不同的底层 类.
可以找到一个不太有效的示例here(因为它依赖于类型名称,但不允许进行接口比较)
具体来说,扩展发现的 IsTypeSafe 函数 here on CodeReview 但进行了调整,以便如果对象支持所有先前添加的项目共有的接口,则可以将其添加到列表中。
具体问题:有没有办法确定两个对象是否都实现了编译时未指定的公共接口?
我真的对你的 "unspecified at compile time" 措辞感到困惑,但你问题的症结在于:
if an object supports an interface common to all previously added items, it can be added to the list.
换句话说,你问的是 VBA 中是否有办法做到这一点(VBA/C# 的伪混搭):
isOk = item.Type.Interfaces.Any(i => other.Type.Interfaces.Contains(i))
为了能够检查对象变量的已实现接口,您需要能够在 运行 时检查其类型。这种能力叫做"reflection"...而VBA做不到。
Rubberduck(免责声明:我管理这个 OSS VBIDE 插件项目)有一个 COM API,它最终可能会增长以支持它(它是开源的,实现它 - 我们很高兴接受拉取请求!),但为了发挥它的魔力,它需要从字面上解析和解析整个项目及其所有引用,这意味着将反射用于你想用它的地方,将是大规模 性能下降。
"type-safe" List
class in VBA 基本上是雾里看花。抱歉!
给定 Object1 和 Object2,是否有任何技术可以确定它们是否都实现了公共接口?如果接口在编译时已知(使用 typeof ... is [known interface])没问题,但如果在编译时未指定接口怎么办?
具体用例是实现强类型集合对象。如果 Object2 与 Object1 共享一个公共接口,我只想添加它。 Typename 不起作用,因为它 returns 底层对象类型,我可能有两个不同的对象,每个对象都实现 ISomeInterface 但在不同的底层 类.
可以找到一个不太有效的示例here(因为它依赖于类型名称,但不允许进行接口比较)
具体来说,扩展发现的 IsTypeSafe 函数 here on CodeReview 但进行了调整,以便如果对象支持所有先前添加的项目共有的接口,则可以将其添加到列表中。
具体问题:有没有办法确定两个对象是否都实现了编译时未指定的公共接口?
我真的对你的 "unspecified at compile time" 措辞感到困惑,但你问题的症结在于:
if an object supports an interface common to all previously added items, it can be added to the list.
换句话说,你问的是 VBA 中是否有办法做到这一点(VBA/C# 的伪混搭):
isOk = item.Type.Interfaces.Any(i => other.Type.Interfaces.Contains(i))
为了能够检查对象变量的已实现接口,您需要能够在 运行 时检查其类型。这种能力叫做"reflection"...而VBA做不到。
Rubberduck(免责声明:我管理这个 OSS VBIDE 插件项目)有一个 COM API,它最终可能会增长以支持它(它是开源的,实现它 - 我们很高兴接受拉取请求!),但为了发挥它的魔力,它需要从字面上解析和解析整个项目及其所有引用,这意味着将反射用于你想用它的地方,将是大规模 性能下降。
"type-safe" List
class in VBA 基本上是雾里看花。抱歉!