向现有类添加强制转换
本文关键字:转换 添加 | 更新日期: 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
}