【问题标题】:C#: Writing an explicit cast operator for an internal class in another .NET assemblyC#:为另一个 .NET 程序集中的内部类编写显式转换运算符
【发布时间】: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


【解决方案1】:

不,没有。即使该类是公开的并且您确实从您的类中显式转换为VendorInternalTypeA,有问题的代码将object 类型的表达式转换为VendorInternalTypeA,而不是您的表达式自定义类型,因此即使存在显式转换运算符也不会使用。

用户定义的转换运算符在编译时绑定,当要转换的表达式的编译时类型有一个用户定义的运算符到它要转换的类型时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2012-03-22
    相关资源
    最近更新 更多