要解决此问题,请保持与现有代码的向后兼容性,以及未来代码的良好实践。我想出了以下代码:
public class Auto<T> where T: struct
{
private T? _value;
public Auto()
{
_value = default(T);
}
public Auto(T val)
{
_value = val;
}
public Auto(T? val)
{
_value = val;
}
public bool HasValue
{
get
{
return _value.HasValue;
}
}
public T Value
{
get { return _value.HasValue ? _value.Value : default(T); }
}
public static implicit operator T(Auto<T> d)
{
return d._value.HasValue ? d._value.Value : default(T);
}
public static implicit operator Auto<T>(T d)
{
return new Auto<T>(d);
}
public static implicit operator T?(Auto<T> d)
{
return (d._value);
}
public static implicit operator Auto<T>(T? d)
{
return new Auto<T>(d);
}
}
要使用的:
class MyEntity
{
public Auto<long> ID;
public Auto<short> Status;
public String Name;
//rest of entity code here
}
这样,我不必绕过现有的代码库添加.HasValue
's 和.Values
无处不在,我也不必使用IsStatusNull()
(尽管出于兼容性原因需要这些方法,它们将简单地返回HasValue
)。
不确定这对其他人有多大帮助,但这是创建新的 DAL 层以替换旧的坏 DAL 层的最明智的方法,并且必须尽可能少地更改现有的 BLL 和 App 层。