簡體   English   中英

是否可以為通用Enum類型編寫擴展方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM