我正在构建一个接口以允许 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>>();
?