これを解決するには、既存のコードとの下位互換性を維持し、将来のコードでの適切な実践を行ってください。次のコードを思いつきました:
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
とを追加する必要はありません.Values
。また、使用するIsStatusNull()
必要もありません (これらのメソッドは互換性の理由で必要ですが、単に を返しHasValue
ます)。
これが他の人にとってどれほど役立つかはわかりませんが、これは新しい DAL レイヤーを作成して古い不良 DAL レイヤーを置き換える最も賢明な方法であり、既存の BLL レイヤーとアプリ レイヤーをできるだけ変更する必要はありません。