系统结构/类的自动Nullable到非可空转换运算符

时间:2013-11-08 15:33:24

标签: c#

我试图将一个巨大的项目从使用XSD转换为使用实体,但问题是XSD没有生成Nullable类型,它们生成了非可空类型和生成的方法,如{{ 1}}。

我希望我们的实体能够正常运行并且是可以为空的类型,但我不想绕过(400,000 SLOC)项目并将IsMyFieldNameNull()添加到对实体属性的每次访问的所有实例中。 / p>

我想出了:

.Value

但是给出了错误“具有相同参数和返回类型的转换运算符”。有没有人知道如何最好地解决这个问题,如果上面的代码甚至可能?

1 个答案:

答案 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图层中尽可能少地进行更改。