NHibernate がカスタム型から文字列に、またはその逆に変換できるようにするインターフェイスを構築しています。
public interface IStringToTypeConverter<T>
{
T FromString(string value);
string ToString(T value);
}
タイプT
は何でもかまいません。この例では、列挙型を使用します。NHibernate には列挙型を変換する機能があることは知っていますが、これは問題の最も単純な例です。
public enum TransactionStatus { Failed, Pending, Succeeded }
public class TransactionStatusConverter : IStringToTypeConverter<TransactionStatus>
{
public TransactionStatus FromString(string value)
{
return (TransactionStatus)Enum.Parse(typeof (TransactionStatus), value, true);
}
public string ToString(TransactionStatus value)
{
return value.ToString();
}
}
これまでのところは問題ありませんTransactionStatusConverter
が、ジェネリック型と制約を持つクラスにジェネリック型として指定しようとすると、問題が発生しますIStringToTypeConverter<T>
。
public sealed class CustomStringType<TConverter, TType> : IUserType where TConverter : IStringToTypeConverter<TType>, new()
{
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string;
var converter = new TConverter();
return converter.FromString(value);
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var converter = new TConverter();
((IDataParameter)cmd.Parameters[index]).Value
= converter.ToString((TType)value);
}
}
NHibernate でのこのクラスの使用法:
Property(x => x.Status, map =>
{
map.Column("TransactionStatusID");
map.Type<CustomStringType<TransactionStatusConverter, TransactionStatus>>();
});
Type<>()
関数の型制約は ですIUserType
。
私の問題は、コンバーターのタイプから推測する必要があるため、冗長でmap.Type<CustomStringType<TransactionStatusConverter, TransactionStatus>>();
あると感じることです。TransactionStatus
CustomStringType
私のマッピングコードが次のように読めるようにするにはどうすればよいでしょうmap.Type<CustomStringType<TransactionStatusConverter>>();
か?