gpt4 book ai didi

c# - 继承泛型类型和约束时的类型推断

转载 作者:行者123 更新时间:2023-11-30 16:16:46 24 4
gpt4 key购买 nike

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

最佳答案

如果您可以省略类型参数,就没有什么可以阻止您拥有一个同时实现了 IStringToTypeConverter<Foo> 的类。和 IStringToTypeConverter<Bar> .如果该类两者都做了,它可以安全地推断出哪种类型应该用作 CustomStringType 的第二个类型参数。 ?请记住:您只能做出编译器可以做出的逻辑假设,不能作弊并使用您的领域知识来解决问题!

另一方面,如果您将其翻转并仅提供 TransactionStatus类型,暗中希望反射能以某种方式解决你的问题,两个不同的类可能都实现了 IStringToTypeConverter<TransactionStatus> .你仍然有问题,你不知道哪一个对你的问题是正确的。同样,如果没有领域知识,这个问题对编译器来说是棘手的。

关于c# - 继承泛型类型和约束时的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17953820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com