1

私は NHibernate IUserType を使用して、いくつかの固定サイズの double[] フィールド (異なるサイズ) を BLOB として単一のデータベース列にバインドしようとしています。次のコードがありますが、どういうわけか定数整数を渡す必要があるため、配列の大きさを知ることができます。実行時にカスタムの方法でこの型をインスタンス化する方法はないと思うので、サイズは実際には型自体の一部である必要があります。できれば、この醜いクラスのコピーを 2 つ持つのは避けたいと思います。

public class DoubleArrayUserType<Size> : NHibernate.UserTypes.IUserType
{
    private int _size = sizeof(Size);

    public object Assemble(object cached, object owner)
    {
        if (cached == null)
            return null;

        if (cached == DBNull.Value)
            return null;

        if (!(cached is byte[]))
            throw new ArgumentException();

        var arrayBytes = cached as byte[];
        var arrayStream = new BinaryReader(new MemoryStream(arrayBytes));

        var values = new double[_size];
        for (int i = 0; i < _size; ++i)
            values[i] = arrayStream.ReadDouble();

        return values;
    }

    public object Disassemble(object value)
    {
        if (value == null)
            return DBNull.Value;

        if (value == DBNull.Value)
            return DBNull.Value;

        if (!(value is double[]))
            throw new ArgumentException();

        var values = value as double[];
        var bytes = new List<byte>(sizeof(double) * _size);
        for (int i = 0; i < _size; ++i)
            bytes.AddRange(BitConverter.GetBytes(values[i]));
        return bytes.ToArray();
    }

    public NHibernate.SqlTypes.SqlType[] SqlTypes
    {
        get { return new NHibernate.SqlTypes.SqlType[] { NHibernate.SqlTypes.SqlTypeFactory.GetBinaryBlob(1) }; }
    }
}
4

1 に答える 1

7

これは物議を醸す解決策です(反対票が予想されます!)が、定数は得られません。別の方法でも問題を解決できると確信しています。

public interface IHasSize{
  int Size { get; }
}

public class MySize : IHasSize { 
  public int Size { get { return 4; } }
}

public class RequiresASize<TSize> where TSize : IHasSize, new()
{
  private int _size = new TSize().Size;
}

public class ProvidesASize : RequiresASize<MySize>{
  //_size in base class will be 4
}

RequiresASize<TSize>あなたの質問の大きなクラスもそうです。最後に型による継承を使用して、ProvidesASizeそれがどのように機能するかを示します。

于 2012-07-31T15:12:12.100 に答える