2012-12-31 206 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