[英]Is it possible to write an extension method for a generic Enum type?
在這個StackOverflow問題上 ,我發現了一個非常好的幫助程序方法,用於將字符串解析為通用Enum值:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
我想將其從輔助方法更改為擴展方法 ,但我對使用泛型並不十分熟悉,因此不確定是否/如何使用泛型。
我嘗試過此方法,但是您很快就會看到此代碼實際上並未編譯:
public static T ParseEnum(this T myEnum, string value)
{
return (T) Enum.Parse(typeof(myEnum), value, true);
}
我也嘗試過這樣做,但這也不起作用:
public static Enum ParseEnum(this Enum myEnum, string value)
{
return Enum.Parse(typeof(myEnum), value, true);
}
甚至可以做我在這里問的事情嗎?
編寫擴展方法時,您需要做的第一件事就是弄清楚如何調用它。 即你在擴大?
在解析string
並返回enum
值的情況下,真正有意義的唯一事情就是擴展string
類。 在該視圖中,擴展方法將如下所示:
public static T ParseEnum<T>(this string text)
{
return (T)Enum.Parse(typeof(T), text);
}
您可以這樣稱呼它:
Pets pet = "Cat".ParseEnum<Pets>();
另一種選擇是使用類型推斷,但要以引用參數為代價(我希望避免):
public static void ParseEnum<T>(this string text, out T t)
{
t = (T)Enum.Parse(typeof(T), text);
}
您會這樣稱呼:
Pets pet;
"Cat".ParseEnum(out pet);
恕我直言,即使您得到類型推斷,它也不是很好,因為您不能在表達式中使用方法調用。
請注意,語法Pets.ParseEnum("Cat")
無效,因為Pets
是類型名稱,而不是類型實例,並且只能基於對象實例進行擴展。 但是上面的示例也許足夠接近(無論如何鍵入的字符數都差不多:))
您可以將您的輔助方法重命名為Enum <>,以使其看起來像在擴展Enum。
/// <summary> Enum Extension Methods </summary>
/// <typeparam name="T"> type of Enum </typeparam>
public class Enum<T> where T : struct, IConvertible
{
public static T Parse(string input)
{
return (T)Enum.Parse(typeof(T), input, true);
}
}
然后以與OP提到的輔助方法相同的方式使用它:
var result = Enum<StatusEnum>.Parse("Active");
這不是擴展方法。 但是,它具有擴展方法的目標之一。 將類命名為接近Enum會嘗試幫助發現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.