如何在方法参数中将泛型Enum作为字典键传递

时间:2015-03-09 18:30:01

标签: c# dictionary enums

我正在尝试创建一个方法来计算给定枚举在某些现有词典中出现的次数,以便进行报告:

private static Dictionary<string, int> CountEnumOccurrence(Dictionary<Enum, List<string>> valueSource)
{
    var convertedDictionary = new Dictionary<string, int>();

    foreach (var entry in valueSource)
    {
        var name = Enum.GetName(entry.Key.GetType(), entry.Key);
        convertedDictionary.Add(name, entry.Value.Count);
    }

    return convertedDictionary;
}

但是,如果我尝试这样调用此方法:

var criticalFailureCounts = CountEnumOccurrence(reportSpan.criticalFailures));

我得到了

  

“无法从'System.Collections.Generic.Dictionary<Reporter.CriticalFailureCategory,System.Collections.Generic.List<string>>'转换为'System.Collections.Generic.Dictionary<System.Enum,System.Collections.Generic.List<string>>'”

即使Reporter.CriticalFailureCategory是一个枚举。我显然是以错误的方式做这件事,但我觉得应该有办法实现它。

以下是Reporter.CriticalFailureCategory的定义:

namespace Reporter
{
    [DataContract(Namespace = "")]
    public enum CriticalFailureCategory
    {
        [EnumMember]
        ExcessiveFailures,
        [EnumMember]
        StalledInConfiguration
    }
}

这个想法是可以无限期地扩展它,而不必重写报告它的代码。

1 个答案:

答案 0 :(得分:2)

您需要使CountEnumOccurrence通用才能使其生效。

private static Dictionary<string, int> CountEnumOccurrence<TEnum>(
    Dictionary<TEnum, List<string>> valueSource)
{
    var convertedDictionary = new Dictionary<string, int>();

    foreach (var entry in valueSource)
    {
        var name = Enum.GetName(entry.Key.GetType(), entry.Key);
        convertedDictionary.Add(name, entry.Value.Count);
    }

    return convertedDictionary;
}

如果您想将TEnum类型限制为枚举,可以查看此question,了解如何以及为何必须进行部分运行时检查,或者您必须编写MSIL。< / p>