【发布时间】:2013-07-30 17:44:24
【问题描述】:
我正在构建一个接口以允许 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>>(); ?
【问题讨论】:
-
我可能错了,但
new()上的TConverter : IStringToTypeConverter<TType>, new()约束不会强制TType成为class或struct(在你的情况下它是@987654339 @)? -
@AndrewCoonce Nope
T : new()仍然适用于enums,并返回default(T)。
标签: c# .net generics interface