1

我正在尝试将一个大型项目从使用 XSD 转换为使用实体,但这样做的一个问题是 XSD 没有生成Nullable类型,它们生成了不可为空的类型并生成了诸如IsMyFieldNameNull().

我想让我们的实体正常工作并且是可为空的类型,但我不想绕过 (400,000 SLOC) 项目并将 .Value每个访问实体属性的所有实例添加到所有实例中。

我想出了:

namespace System
{
    public partial struct Int64
    {
        public static explicit operator Int64(Int64? d)
        {
            return (d.Value);
        }
    }
}

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

4

1 回答 1

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's 和.Values无处不在,我也不必使用IsStatusNull()(尽管出于兼容性原因需要这些方法,它们将简单地返回HasValue)。

不确定这对其他人有多大帮助,但这是创建新的 DAL 层以替换旧的坏 DAL 层的最明智的方法,并且必须尽可能少地更改现有的 BLL 和 App 层。

于 2013-11-08T21:27:07.397 回答