簡體   English   中英

C#如何將枚舉的通用類型作為變量傳遞給函數…?

[英]C# How to pass a generic type of enum as a variable into a function…?

我想做一個靜態的泛型函數來處理所有有關創建字典並返回它的情況。 我寫這樣的函數。

public static Dictionary<string, T> GetDictionaryNameToEnum<T>(IEnumerable<T> type)
{
    Dictionary<string, T> dict = new Dictionary<string, T> ();
    foreach (T value in Enum.GetValues(typeof(T))) {
        dict.Add (value.ToString (), value);
    }
    return dict;
}

但是當我這樣調用函數時。

public enum FlipType
{
    normal,
    y4,
    x4,
    y4x4,
}

static Dictionary<string, FlipType> FlipNameToType = new Dictionary<string, FlipType> ();
public static FlipType GetFlipType(string flipTypeName)
{
    if (FlipNameToType == null) {
        FlipNameToType = GameUtil.GetDictionaryNameToEnum (FlipType);
    }

    return FlipNameToType [flipTypeName];
}

我遇到編譯問題。

錯誤CS0118:“ macehead.GameWrapperBrickSet.FlipType”是“類型”,但應為“變量”(CS0118)(Assembly-CSharp)

如何調用此功能? 我可以這樣做嗎?還是有更好的方法。

此錯誤是可以預期的。 FlipType是一種類型時,可以將其傳遞給您的方法。
這將是您方法的正確用法:

FlipNameToType = GameUtil.GetDictionaryNameToEnum<FlipType>(null);

null是因為IEnumerable<T> type方法參數的用法是絕對不清楚的,並且實際上您不在方法內部使用它。 也許,您只需要刪除此參數。

通常,您的代碼過於復雜且不清楚。
如果您需要通過名稱了解FlipType ,則無需在Dictionary存儲值,您可以使用Enum.ParseEnum.TryParse

public static FlipType GetFlipType(string flipTypeName)
{
    FlipType parsed; // in C# 7.0 can be simplified into 'out FlipType parsed'

    if (!Enum.TryParse<FlipType>(flipTypeName, out parsed)
    {
        throw new OutOfRangeException(nameof(flipTypeName));
    } 

    return parsed;
}

請注意,如果flipTypeName與任何FlipType枚舉值都不匹配,則此代碼將引發OutOfRangeException 但是,您的代碼執行相同的操作-如果在Dictionary<string, T>沒有找到鍵,它將引發異常。

希望它能對您有所幫助。

 class Program
{
    static void Main(string[] args)
    {
        Console.Write(GetFlipType("normal"));
    }

    static Dictionary<string, FlipType> FlipNameToType = new Dictionary<string, FlipType>();
    public static FlipType GetFlipType(string flipTypeName)
    {
        if (FlipNameToType == null || FlipNameToType.Count == 0)
        {
            FlipNameToType = default(FlipType).ToDictionaryMembersEx();
        }

        return FlipNameToType[flipTypeName];
    }

    public enum FlipType
    {
        normal,
        y4,
        x4,
        y4x4,
    }

}

public static class EnumExtensions
{
    public static Dictionary<string, TEnum> ToDictionaryMembersEx<TEnum>(this TEnum source) where TEnum : struct, IConvertible
    {
        Dictionary<string, TEnum> dict = new Dictionary<string, TEnum>();
        foreach (TEnum value in Enum.GetValues(typeof(TEnum)))
        {
            dict.Add(value.ToString(), value);
        }
        return dict;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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