扩展返回父类型

时间:2012-12-31 17:09:05

标签: c#-4.0 extension-methods

我知道我可以通过泛型来做到这一点,如下所示,但是我如何构建一个扩展来使用泛型返回父类型?

通用扩展签名:
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,只是认为我会尝试在没有泛型的情况下使用扩展逻辑模式来做它。

1 个答案:

答案 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");