私は 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) }; }
}
}