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

时间:2011-08-29 17:24:16

标签: c# generics refactoring operators

我的课程中有一堆implicit operator个。在下面的代码中,仅使用了implicit operator的几个示例。我正在寻找任何想法如何重构这一点,而不是使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);
    }
}

1 个答案:

答案 0 :(得分:6)

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

如果这不是一个选项,您可能会考虑以下几点,主要是外观变化:

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

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

  • 无需重复播放 Nullables

    DateTime? dt = (DateTime?) DateTime.Now; 
    

按预期工作

    DateTime? dt = (DateTime?) null; 

同样有效(这是你正在做的事情,因为你在你的函数中返回null; 在签名中返回值 DateTime?,对吗?

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

public static implicit operator DateTime?(SafeValue instance) {    
    return (DateTime?)instance.value;    
}

重复 int?等。