C#:为另一个 .NET 程序集中的内部 class 编写显式转换运算符
C#: Writing an explicit cast operator for an internal class in another .NET assembly
我正在处理第 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
的实例。 subclass 在这里可以很好地工作——但是 VendorInternalTypeA
是密封的,所以我不能 subclass 它。
经过一番思考,我突然想到,如果我可以定义一个 class 来为 [=12= 实现 explicit operator ],那演员表 会 工作,我将能够传递我自己的 class 的实例,让他们玩得很好!
我很兴奋,直到我想起 VendorInternalTypeA
也是一个 internal class,所以我不能在我的代码中直接引用它.
那么,我的问题是:是否有解决此问题的方法,可以使用反射、IL 发射或其他稍微有点老套的方法?在另一个 class?
的 定义 中引用此内部 class 的方法
(我 90% 放弃这个项目并说它根本无法完成——而且仍然可能,即使答案是“是的,这就是方法”。但这确实是对我来说很有趣的问题。)
不,没有。即使 class 是 public 而你 确实 从你的 class 显式转换为 VendorInternalTypeA
,有问题的代码是将类型 object
的表达式转换为 VendorInternalTypeA
而不是自定义类型的表达式,因此即使存在显式转换运算符也不会被使用。
用户定义的转换运算符在编译时绑定,当被转换的表达式的编译时类型具有一个用户定义的运算符到它被转换成的类型时。
我正在处理第 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
的实例。 subclass 在这里可以很好地工作——但是 VendorInternalTypeA
是密封的,所以我不能 subclass 它。
经过一番思考,我突然想到,如果我可以定义一个 class 来为 [=12= 实现 explicit operator ],那演员表 会 工作,我将能够传递我自己的 class 的实例,让他们玩得很好!
我很兴奋,直到我想起 VendorInternalTypeA
也是一个 internal class,所以我不能在我的代码中直接引用它.
那么,我的问题是:是否有解决此问题的方法,可以使用反射、IL 发射或其他稍微有点老套的方法?在另一个 class?
的 定义 中引用此内部 class 的方法(我 90% 放弃这个项目并说它根本无法完成——而且仍然可能,即使答案是“是的,这就是方法”。但这确实是对我来说很有趣的问题。)
不,没有。即使 class 是 public 而你 确实 从你的 class 显式转换为 VendorInternalTypeA
,有问题的代码是将类型 object
的表达式转换为 VendorInternalTypeA
而不是自定义类型的表达式,因此即使存在显式转换运算符也不会被使用。
用户定义的转换运算符在编译时绑定,当被转换的表达式的编译时类型具有一个用户定义的运算符到它被转换成的类型时。