我知道我可以通过泛型来做到这一点,如下所示,但是我如何构建一个扩展来使用泛型返回父类型?
通用扩展签名:public static TEnum FromString<TEnum>(this Enum par , string val ) where TEnum : Enum {
return (TEnum) Enum.Parse(par.GetType(), val);
}
签名风格,我知道它不会工作,但有点像我正在寻找。
public static this FromString(this Enum par , string val ) {
return Enum.Parse(par.GetType(), val);
}
基本上我有一系列Enum将其值解析为一个进程的字符串,作为接收器我需要将该字符串值解析为Enum进行验证。最终,如果string
值不是枚举器中的有效值,它将返回null或default
值。事实上,我需要能够返回source
枚举器的类型,而无需执行泛型。
如果它不可能,那就是kewl,只是认为我会尝试在没有泛型的情况下使用扩展逻辑模式来做它。
答案 0 :(得分:1)
简短的回答是否定的,您需要Generics返回Enum的正确类型。
否则,您将只拥有基本的Enum
类型,而不是枚举的特定类型。
可以做的是创建一个像这样的扩展方法:
public static Enum FromString(this Enum par, string val)
{
return (Enum) Enum.Parse(par.GetType(), val);
}
但是正如你所看到的,你会得到一种'Enum'而不是你特定的枚举 另一方面:
Enum val = default(MyEnum).FromString("SomeEnumValue");
bool isEnum = val is MyEnum; // Returns True
正如您所见,val
类型为MyEnum
而isEnum返回true
这也有效:
MyEnum val = (MyEnum)default(MyEnum).FromString("SomeEnumValue");