1

巨大なプロジェクトを XSD の使用からエンティティの使用に変換しようとしていますが、これに関する問題は、XSD が型を生成せずNullable、null 非許容型を生成し、IsMyFieldNameNull().

エンティティを適切に機能させ、null 許容型にしたいのですが、(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とを追加する必要はありません.Values。また、使用するIsStatusNull()必要もありません (これらのメソッドは互換性の理由で必要ですが、単に を返しHasValueます)。

これが他の人にとってどれほど役立つかはわかりませんが、これは新しい DAL レイヤーを作成して古い不良 DAL レイヤーを置き換える最も賢明な方法であり、既存の BLL レイヤーとアプリ レイヤーをできるだけ変更する必要はありません。

于 2013-11-08T21:27:07.397 に答える