2012-12-31 203 views
1

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

通用扩展签名:
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值在枚举器中不是有效值,它将返回空值或default值。其实我需要能够返回source枚举器的类型,而不必做一个通用的。

如果它不可能,那就是kewl,只是想我会尝试做到没有泛型,并使用扩展逻辑模式来做到这一点。

+0

有没有你不”的理由不想用泛型来做这件事? – Blachshma

+0

已经把它作为一个泛型来完成,只是想知道它是否可能将扩展视为泛型的副作用。 – GoldBishop

回答

1

简短的回答是否定的,您需要泛型才能返回Enum的类型
否则,你只需要基本的Enum类型,而不是你枚举的具体类型。

什么你可以做的就是创建一个扩展方法是这样的:

public static Enum FromString(this Enum par, string val) 
{ 
    return (Enum) Enum.Parse(par.GetType(), val);  
} 

但正如你所看到的,你会得到一个类型的“枚举”不是你的具体枚举。
在另一方面:

Enum val = default(MyEnum).FromString("SomeEnumValue"); 
bool isEnum = val is MyEnum; // Returns True 

正如你可以看到valMyEnum和isEnum返回true

这也适用于:

MyEnum val = (MyEnum)default(MyEnum).FromString("SomeEnumValue"); 
+0

太糟糕了,我不能创建一个通用的,然后在Enum中扩展该泛型。 TY为开箱即用的例子。 – GoldBishop