繁体   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