【发布时间】:2021-11-22 10:26:42
【问题描述】:
我正在处理第 3 方库密封的内部类型。我们称这种类型为VendorInternalTypeA。它用于程序集VendorLibraryA。
我想在几个地方用我自己的一种不同类型替换VendorInternalTypeA。这比您预期的效果更好,但是在第 3 方内部代码中也存在一个问题:
// Example code to illustrate the problem: no actual ArrayLists are being used.
void SaveA(object maybeA) {
arrayList.Add(maybeA);
}
VendorInternalTypeA LoadA() {
return (VendorInternalTypeA) arrayList[0];
}
这意味着LoadA 期待VendorInternalTypeA 的实例,或者至少它可以显式转换为VendorInternalTypeA 的实例。子类在这里可以很好地工作——但VendorInternalTypeA 是密封的,所以我不能子类化它。
经过一番思考,我突然想到,如果我可以为VendorInternalTypeA 定义一个实现explicit operator 的类,那么该强制转换会 工作,并且我可以传入我自己班级的实例并让他们玩得很好!
我很兴奋,直到我想起 VendorInternalTypeA 也是一个 internal 类,所以我不能在我的代码中直接引用它。
那么,我的问题是:有没有办法解决这个问题,使用反射、IL 发射或其他稍微笨拙的方法?在另一个类的定义中引用这个内部类的方法?
(我 90% 愿意放弃该项目并说它根本无法完成——而且仍然可能,即使答案是“是的,这就是方法”。但这是一个非常有趣的问题对我来说。)
【问题讨论】:
-
反编译 VendorInternalTypeA 的源代码,然后粘贴到自己的应用程序中?
-
你现在的“替代”部分怎么样?
-
@RobertHarvey 它仍然是不同的类型!而且 .NET 不允许“鸭式打字”(除非最近发生了一些变化,即使这样也可能只在某些情况下发生!)
-
我不太希望。将事物标记为内部和私有的全部目的是防止此类事情发生。
-
@RobertHarvey 是的,任何这样的解决方案都将是代码异味和易碎的。我承认这一点。在这一点上,我出于好奇而进行操作。
标签: c# type-conversion internals