C# 强制从字符串解析泛型参数的约束

C# 强制从字符串解析泛型参数的约束,c#,constraints,generics,C#,Constraints,Generics,在本主题中,我们可以找到创建泛型类的解决方案,该类提供从字符串到泛型参数类型的解析。但是,指定给此参数的类型可能不提供这种转换。有没有一种方法可以使约束确保这一点 更新: 谢谢你的回答。然而,我知道我通常可以作出限制。问题是:是否存在所有类型(Convert.ChangeType不会失败)都实现的接口。或者由所有类型通过Parse(string)方法实现。您需要使用来限制泛型类中可以使用哪些类型的对象。您应该定义一个可用于进行转换的接口,然后将该接口设置为约束。因为,正如我在评论中所说,您不能将

在本主题中,我们可以找到创建泛型类的解决方案,该类提供从字符串到泛型参数类型的解析。但是,指定给此参数的类型可能不提供这种转换。有没有一种方法可以使约束确保这一点

更新:
谢谢你的回答。然而,我知道我通常可以作出限制。问题是:是否存在所有类型(Convert.ChangeType不会失败)都实现的接口。或者由所有类型通过Parse(string)方法实现。

您需要使用来限制泛型类中可以使用哪些类型的对象。您应该定义一个可用于进行转换的接口,然后将该接口设置为约束。

因为,正如我在评论中所说,您不能将接口添加到特定类型,也不能在泛型类型约束中使用duck类型,所以您可能不得不编写一个有点粗糙的解决方案。我认为最好的办法是对解析函数进行多个重载,每个重载用于基本类型(int、char、string等),然后提供一个通用的重载,该重载将IConvertible作为其通用约束。编译器将选择正确的重载,或者在不可转换类型的情况下根本不选择重载。

这里有两个问题:一个是不能向现有类型添加接口,也不能对泛型约束使用duck类型。这将使它很难解决。我想可能已经存在所需的接口。不管怎样,这就是答案。谢谢。@konrad.kruczynski:唉,不是。基类库实际上设计得有点糟糕。理想情况下,每个核心操作或操作集都会有一个与之相关联的接口,并且基本类型会实现这些接口。您能稍微扩展一下重载吗?我很难想象编译器如何选择正确的重载。@MikeCole:编译器总是选择更具体的重载,而不是更一般的重载。因此,如果您有一个
Parse(int-arg)
和一个
Parse(T-arg)
,并且您调用
Parse(3)
,它将调用第一个重载,而不是第二个重载,即使第二个重载在技术上不接受整数(没有禁止它的类型约束)。我不确定,5年后,为什么超载是必要的
int
char
等。所有这些都实现了
IConvertible
。但是假设作为原始问题的参数类型,这是不可接受的,那么你必须有一个泛型重载,然后是具体的重载。