繁体   English   中英

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

[英]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));

我懂了

“无法从' 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
    }
}

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

您需要使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类型限制为仅枚举,则可以查看此问题,以了解如何以及为什么必须进行部分运行时检查,或者必须编写MSIL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM