C#如何将泛型类型的枚举作为变量传递给函数......?

时间:2017-08-08 03:24:09

标签: c# generics enums

我想创建一个静态泛型函数来处理所有关于构成Dictionary并返回它的情况。 我写了这样一个函数。

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:&#39; macehead.GameWrapperBrickSet.FlipType&#39;是一种&#39;类型&#39;但是一个变量&#39;预期(CS0118)(Assembly-CSharp)

如何调用此功能?我可以这样做吗或者有更好的方法。

2 个答案:

答案 0 :(得分:0)

此错误是可以预料的。您将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;
}

请注意,如果OutOfRangeException与任何flipTypeName枚举值不匹配,则此代码会抛出FlipType。但是,您的代码也是如此 - 如果在Dictionary<string, T>中找不到密钥,它将抛出异常。

答案 1 :(得分:0)

我希望它可以帮到你。

 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;
    }
}