我试图将一个巨大的项目从使用XSD转换为使用实体,但问题是XSD没有生成Nullable
类型,它们生成了非可空类型和生成的方法,如{{ 1}}。
我希望我们的实体能够正常运行并且是可以为空的类型,但我不想绕过(400,000 SLOC)项目并将IsMyFieldNameNull()
添加到对实体属性的每次访问的所有实例中。 / p>
我想出了:
.Value
但是给出了错误“具有相同参数和返回类型的转换运算符”。有没有人知道如何最好地解决这个问题,如果上面的代码甚至可能?
答案 0 :(得分:0)
要解决此问题,请保持与现有代码的向后兼容性,以及未来代码的良好实践。我想出了以下代码:
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和App图层中尽可能少地进行更改。