我的课程中有一堆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);
}
}
答案 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?等。