向现有类添加强制转换

本文关键字:转换 添加 | 更新日期: 2023-09-27 18:02:47

我想添加一个转换到现有的类。

我搜索并发现了一个问题,这个问题的答案是使用扩展而不是操作符。

当我想声明一个操作符时,我遇到了错误提示用户定义的转换必须与封闭类型

转换。

这是否意味着只要我不访问它们的源,我就不能完全向其他类添加操作符?我还缺什么吗?


编辑:

public static explicit operator int(DateTime dt)
{
    return int.Parse(dt.ToShortDateString().Replace("/", "").Replace("-", ""));
}

向现有类添加强制转换

是的,您需要能够修改类或结构来添加操作符。

即使没有原始源代码,您仍然可以有一些选择。(怀疑但可能)

  • 如果类被标记为partial(可能不是),您可以创建一个partial类来扩展现有的类,并在您的partial类中添加操作符。然而(正如Sriram在下面的评论中指出的那样),部分类必须存在于与调用类相同的程序集中。如果您使用的是来自第三方的类,那么很可能它既没有被标记为部分类,也不会与您自己的类在同一个程序集中。(否则,您已经在修改它了。)我包括部分类选项只是作为一个可能但不太可能的选项。

  • 如果类不是密封的,可以派生一个新类,并在派生类中添加操作符。

  • 如果你正在使用的类来自一个开源库,你很可能只需要拉出源代码并对你的类进行必要的修改。

  • 如果您想要修改的类是预打包程序集的一部分,您可以考虑使用像dotPeek这样的反编译器来查看原始类中的代码,并在代码中添加您自己的版本。在大多数情况下,这可能不是一个现实的选择,但我还是提供了它。

Microsoft发布了一个关于添加操作符的简单教程。它已经过时了,但我想它可能会有帮助。

http://msdn.microsoft.com/en-us/library/aa288476 (v = vs.71) . aspx

我已经用。net编写了很长时间的代码,从来没有需要添加操作符。我很想更多地了解你们正在努力解决的问题,看看是否有更可取的方法。

如果你确实有合法的需要实现一个操作符,如果你能提供一些关于用例和限制的额外细节(例如,partial,

)将会非常有帮助。

你必须使用一个中间类。

public struct DateWrap
{
    DateTime date;
    public static implicit operator DateWrap(DateTime dt)
    {
        return new DateWrap() { date=dt };
    }
    public static implicit operator DateTime(DateWrap dw)
    {
        return dw.date;
    }
    public static explicit operator int(DateWrap dw)
    {
        return int.Parse(dw.date.ToShortDateString().Replace("/", "").Replace("-", ""));
    }
}
class Program
{
    static void Main(string[] args)
    {
        DateTime dt=DateTime.Now;
        int x=(int)(DateWrap)dt;
        // x = 5112014
    }
}

    static void Main(string[] args)
    {
        DateWrap dw=DateTime.Now;
        int x=(int)dw;
        // x = 5112014
    }