如果我使用enum Foo {A,P}之类的单个字符名称的枚举,我很确定Dapper会正确映射它们但我不希望这样,我想要带有描述性标签的枚举如下:
enum Foo { [StringValue("A")] Active,[StringValue("P")] Proposed}
在上面的例子中,StringValueAttribute是一个自定义属性,我可以使用反射将“A”转换为Foo.Active,这很好 – 除了我需要Dapper为我执行转换逻辑.我写了一个自定义类型处理程序来执行此 *** 作
public class EnumTypeHandler<T> : sqlMapper.TypeHandler<T>{ public overrIDe T Parse(object value) { if (value == null || value is dbnull) { return default(T); } return EnumHelper.FromStringValue<T>(value.ToString()); } public overrIDe voID SetValue(IDbDataParameter parameter,T value) { parameter.DbType = DbType.String; parameter.Value = EnumHelper.GetStringValue(value as Enum); }}//Usage:sqlMapper.AddTypeHandler(typeof(Foo),(sqlMapper.ITypeHandler)Activator.CreateInstance(typeof(EnumTypeHandler<>).MakeGenericType(typeof(Foo)));
使用sqlMapper.AddTypeHandler()注册似乎工作正常,但是当我的DbConnection.query()代码运行时,我收到一条错误,指出无法转换值’A’ – 从Enum.Parse抛出错误,提示Dapper实际上并没有调用我的类型处理程序,尽管它已被注册.有没有人知道这方面的方法?
解决方法 另一位用户在Dapper的github网站上报告了这个问题.看起来这是一个专门围绕Dapper枚举的故意优化,所以我改变了我的数据库模型,而不是试图改变映射代码.我看着尝试修改Dapper本身,但Dapper的源代码优化得像我见过的任何东西,发出 *** 作码以最高性能的方式执行转换 – 我不想开始尝试弄清楚如何制作在那里改变. 总结以上是内存溢出为你收集整理的c# – 使用自定义SqlMapper.ITypeHandler – Dapper将枚举映射到字符串列全部内容,希望文章能够帮你解决c# – 使用自定义SqlMapper.ITypeHandler – Dapper将枚举映射到字符串列所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)