C#:简化许多类似的隐式运算符方法

FOO*_*FOO 2 c# generics refactoring operators

我有一大堆的课implicit operator.在下面的代码中,只使用了几个implicit operators的例子.我正在寻找任何想法如何重构这一点,而不是使SafeValue类通用.有任何想法吗?

public class SafeValue {
    private readonly object value;
    public SafeValue(object value) {
        if (value == somethingSpecial) {
            value = null;
        }
        this.value = value;
    }
    public static implicit operator string(SafeValue instance) {
        return (string)instance.value;
    }
    public static implicit operator int(SafeValue instance) {
        if (instance.value == null) {
            throw new InvalidCastException("Cannot convert type");
        }
        return (int)instance.value;
    }
    public static implicit operator int?(SafeValue instance) {
        if (instance.value == null) {
            return null;
        }
        return new int?((int)instance.value);
    }
    public static implicit operator DateTime(SafeValue instance)
        if (instance.value == null) {
            throw new InvalidCastException("Cannot convert type");
        }
        return (DateTime)instance.value;
    }
    public static implicit operator DateTime?(SafeValue instance) {
        if (instance.value == null) {
            return null;
        }
        return new DateTime?((DateTime)instance.value);
    }
}
Run Code Online (Sandbox Code Playgroud)

Urb*_*Esc 6

正如我在评论中所说,我认为最好完全替换代码.

如果这不是一个选项,您可以考虑以下,主要是整容变化:

  • 您可能希望摆脱手动抛出的异常.为什么检查null并抛出异常,如果你在下一行中仍然这样做?无论如何,你在那里抛出异常.将null转换为int 导致异常.

  • 为什么所有的?不需要他们.刚演员.

  • 无需将你的Nullables翻倍.

    DateTime? dt = (DateTime?) DateTime.Now; 
    
    Run Code Online (Sandbox Code Playgroud)

按预期工作

    DateTime? dt = (DateTime?) null; 
Run Code Online (Sandbox Code Playgroud)

也可以工作(这就是你正在做的事情,因为你返回null;在你的函数中,在签名中有一个返回值为DateTime?对吧?

您的所有功能都只减少到一行代码.这是DateTime?一个荣耀:

public static implicit operator DateTime?(SafeValue instance) {    
    return (DateTime?)instance.value;    
}
Run Code Online (Sandbox Code Playgroud)

重复int?等等.