将强制转换添加到现有类

时间:2014-05-11 04:39:31

标签: c# .net

我想在现有类中添加一个强制转换。

我搜索并找到a question which was answered by using extensions not operators

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

这是否意味着只要我不访问其源,我就无法将运算符完全添加到其他类中?有什么我想念的吗?


编辑:

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

2 个答案:

答案 0 :(得分:7)

是的,您需要能够修改类或结构以添加运算符。

即使没有原始来源,您仍可能有一些选择。 (令人怀疑但可能。)

  • 如果类被标记为partial(可能不是),则可以创建一个partial类来扩展现有类并在partial类中添加运算符。但是(正如Sriram在下面的注释中指出的那样),部分类必须与调用类存在于同一个程序集中。如果您使用的是来自第三方的类,则可能是因为它们都没有标记为部分类,并且不会与您自己的类在同一个程序集中。 (否则,您已经在修改它了。)我将部分类选项作为可能但不太可能的选项包括在内。

  • 如果该类未被密封,您可以派生一个新类并在派生类中添加运算符。

  • 如果您使用的课​​程来自开源图书馆,您很可能只需提取资源并对您的课程进行必要的修改。

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

Microsoft发布了一个关于添加运算符主题的简单教程。它已经过时了,但我认为它可能会有所帮助。

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

我已经在.NET中编写了很长时间,并且从未需要添加运算符。我真的想了解更多关于你要解决的问题,看看是否有更理想的方法。

如果您确实需要实现运算符,那么如果您可以提供有关用例和限制的其他详细信息(例如,部分,

)将非常有用。

答案 1 :(得分:0)

你必须使用中间类。

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
    }