如何将通用枚举作为方法参数中的字典键传递

How to pass a generic Enum as dictionary key in method parameter

我正在尝试创建一种方法来计算给定枚举在某些现有词典中出现的次数以用于报告目的:

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

我明白了

"cannot convert from 'System.Collections.Generic.Dictionary<Reporter.CriticalFailureCategory,System.Collections.Generic.List<string>>' to '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
    }
}

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

您需要将 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。