generics类中的模糊/冲突构造函数

我有一个通用类:

public class BaseFieldValue { public BaseFieldValue() { //... } public BaseFieldValue(string value) { //... } public BaseFieldValue(T value) { //... } } 

精细。 除了…

 var myValue = new BaseFieldValue("hello"); 

哎呀。 调用不需要的构造函数。 有很多方法可以解决这个问题。 什么是最好的解决方案?

我可能会将一个重载变为工厂方法:

 public static BaseFieldValue Parse(string value){} 

您可以执行以下操作:

 public class BaseFieldValue { public struct Special { internal string m_value; public Special(string value) { m_value = value; } } public BaseFieldValue() { //... } public BaseFieldValue(Special value) { //... } public BaseFieldValue(T value) { //... } } 

…或者,您可以向特殊构造函数添加一个额外忽略的布尔参数,只是为了消除歧义。

无法使Type Contraints做我想要的,所以我的解决方法是删除不明确的构造函数,同时保留字符串的特殊情况:

 public class BaseFieldValue { public BaseFieldValue() { //... } public BaseFieldValue(T value) { //however many things you need to test for here if (typeof(T) == typeof(string)) { SpecialBaseFieldValue(value.ToString()); } else { //everything else } //... } private void SpecialBaseFieldValue(string value) { //... } } 

一个讨厌的黑客,但可能不比任何替代方案更糟糕:

 public class BaseFieldValue { public BaseFieldValue() { // ... } public BaseFieldValue(StringWrapper value) { // ... } public BaseFieldValue(T value) { // ... } public class StringWrapper { private string _value; public static implicit operator string(StringWrapper sw) { return sw._value; } public static implicit operator StringWrapper(string s) { return new StringWrapper { _value = s }; } } } 

现在它可以根据需要使用:

 // call the generic constructor var myValue = new BaseFieldValue("hello"); // call the string constructor var myValue = new BaseFieldValue("hello"); 

也许你可以试试这个:

 var myValue = new BaseFieldValue("hello" as Object);