我想写一个接受枚举的通用类。由于该类旨在实现一些接口,主要目标是能够将枚举视为实现这些接口的其他对象(例如用于列表扩展等)。因此,对于样品枚举枚举的通用类 - 投射问题
public enum QEnum : int
{
xlNoValue = 0,
xlSomeValue = 1
}
public static class QEnumExtensions
{
public static string toString(this QEnum xThis)
{
...
}
public static QEnum toEnum(this string xThis)
{
...
}
}
我想声明泛型类如
public class QEnumHolder<T> where T : struct, IConvertible
{
private T mxVal = default(T);
public QEnumHolder()
{
if (!typeof(T).IsEnum) throw new NotSupportedException();
}
public QEnumHolder(T xVal)
{
if (!typeof(T).IsEnum) throw new NotSupportedException();
mxVal = xVal;
}
static public implicit operator QEnumHolder<T>(T xVal)
{
return new QEnumHolder<T>(xVal);
}
static public implicit operator T(QEnumHolder<T> xVal)
{
return (T)xVal.mxVal;
}
public string toString()
{
if (mxVal is QEnum) return ((QEnum)Convert.ToInt32(mxVal)).toString();
...
}
public void fromString(string xString)
{
if (mxVal is QEnum)
mxVal = (???)xString.toEnum(); // problem
}
}
所有我们使用实现
- 的toString()函数返回的枚举一个“漂亮”的字符串,可以进入comboBoxes等
- 将字符串转换为枚举,如上
因此toString/toEnum的结构几乎是给定的。问题是最后一行代码行标有“问题”。我不知道如何告诉编译器,在这个分支中,toEnum()
和T
的返回类型将是相同的。
我试图通过宣布mxVal
为int
并在任何地方使用Convert.ToInt32
来解决此问题。然而,然后我碰到operator T
问题,其中编译器反对将int
转换为T
(编译器无法知道T
将枚举,因此我不能使用任何“int to enum conversion”讨论在这里)。
作为一般规则,C#使用骆驼案例d代表'ToString()'你应该重写。 – Bauss
@Bauss:我知道,我只是不喜欢它。与Equals()等相同 - 如果你不覆盖它,你会得到一个你不关心的实现,并且没有人会通知你。 –
这个设计有很多问题。如果你的类包含像'QEnum'和'(QEnum)something''这样的代码,即** ** concrete **类型,那么它不是**泛型类。另外,你不能有一个只有返回类型不同的多个'ToEnum(string)'扩展方法。 –