使用Dictionary<Enum, string>出现编译错误的技术咨询
解决Dictionary<Enum, string>的类型转换编译错误
问题场景
现有类定义、枚举、转换工具类如下:
Error类
public class Error : IError { public StatusEnum Status { get; set; } public Dictionary<Enum, string> Errors { get; set; } public Error(StatusEnum status, Dictionary<Enum, string> errors) { Status = status; Errors = errors; } }
IdentityErrorEnum枚举
public enum IdentityErrorEnum { PasswordRequiresDigit, PasswordRequiresLower, PasswordRequiresNonAlphanumeric, PasswordRequiresUpper, PasswordTooShort }
EnumHelper工具类
public static class EnumHelper { public static T FromString<T>(string value) { return (T)Enum.Parse(typeof(T), value); } }
尝试将IdentityResult的错误集合转换为Dictionary<Enum, string>时出现编译错误:
var result = await base.CreateAsync(_userMapper.ToEntity(user), password); Dictionary<Enum, string> dictionary = result.Errors.ToDictionary(e => EnumHelper.FromString<IdentityErrorEnum>(e.Code), e => e.Description);
错误信息:
Cannot implicitly convert type 'System.Collections.Generic.Dictionary<IdentityErrorEnum, string>' to 'System.Collections.Generic.Dictionary<System.Enum, string>'
错误原因
Dictionary<TKey, TValue>是不变泛型类型,即使IdentityErrorEnum继承自Enum,Dictionary<IdentityErrorEnum, string>也无法直接隐式转换为Dictionary<Enum, string>。编译器不允许这种转换,避免后续向字典中添加其他枚举类型的键导致类型不一致。
解决方法
方法一:直接创建Enum键的字典
在ToDictionary时显式将键转换为Enum类型,让编译器推断出目标字典的键类型为Enum:
Dictionary<Enum, string> dictionary = result.Errors .ToDictionary( e => (Enum)EnumHelper.FromString<IdentityErrorEnum>(e.Code), e => e.Description );
方法二:改为泛型Error类(推荐)
修改Error类为泛型,约束键为特定枚举类型,既保留类型安全又满足需求:
public class Error<TEnum> : IError where TEnum : Enum { public StatusEnum Status { get; set; } public Dictionary<TEnum, string> Errors { get; set; } public Error(StatusEnum status, Dictionary<TEnum, string> errors) { Status = status; Errors = errors; } }
使用时直接传入IdentityErrorEnum类型的字典:
var dictionary = result.Errors.ToDictionary( e => EnumHelper.FromString<IdentityErrorEnum>(e.Code), e => e.Description ); var error = new Error<IdentityErrorEnum>(status, dictionary);
方法三:转换现有字典的键
如果已经生成了Dictionary<IdentityErrorEnum, string>,可以通过二次转换得到目标字典:
var identityDict = result.Errors.ToDictionary( e => EnumHelper.FromString<IdentityErrorEnum>(e.Code), e => e.Description ); Dictionary<Enum, string> dictionary = identityDict.ToDictionary(kv => (Enum)kv.Key, kv => kv.Value);
注意:此方法会额外创建一次字典实例,性能略低于前两种方法。
内容的提问来源于stack exchange,提问作者KTOV
相关产品推荐
相关产品推荐

