是否有可能重载I don';类的隐式或显式强制转换运算符;t拥有

本文关键字:转换 拥有 运算符 重载 有可能 don 是否 | 更新日期: 2023-09-27 18:28:22

几乎都在标题中。是否可以在我不拥有的类上创建强制转换重载。例如,如果我要为NotifyIcon类(它是密封的)创建一个包装器,我实际上不能将它与任何东西一起使用;我必须返回一个实例,这个实例有点扼杀了做装饰器的能力。有可能在某个地方创建一个强制转换重载,在那里我基本上可以返回NotifyIcon的私有实例吗?听起来不太稳定,但我认为它会达到我想要的。

通常,我会做一些类似的事情:

public static implicit operator MyClass(SomeOtherClass input)
{
    // do things to come up with a MyClass
}

但只有当返回类型为MyClass时,这才有效。我想做一些简单的事情,比如:

public class MyPsuedoDecoratorClass
{
    private NotifyIcon _icon;
    public MyPsuedoDecoratorClass(NotifyIcon icon)
    {
        _icon = icon;
    }
    // some decorated methods
    public static implicit operator NotifyIcon(MyPsuedoDecoratorClass input)
    {
        return _icon;
    }   
}

这样我就可以将它用作初始化包装器。

是否有可能重载I don';类的隐式或显式强制转换运算符;t拥有

你基本上不能,但你可以使用NotifyIcon的标签来存储它的人工派生对象,它仍然很优雅:

public static class NotifyIconExtesionMethods {
    public static MyClass As<T>( this NotifyIcon notifyIcon ) {
        return notifyIcon.Tag as T;
    }
}
class MyClass {
    private NotifyIcon notifyIcon;
    public MyClass( ) {
        notifyIcon = ...;
        ...
        notifyIcon.Tag = this;
    }
    public T As<T>( ) {
        return notifyIcon as T;
    }
}
//In some method:
var notifyIcon = new MyClass( ).As<NotifyIcon>( );
...
var myClass = notifyIcon.As<MyClass>( );