我有大量的PL / sql存储过程返回列,其中单个字符串表示固定范围内的某种状态值.在我正在研究的项目中,这些列已经被Dapper映射到域对象上的字符串属性,这些属性管理起来很笨拙且不可靠,所以我想切换到枚举.
如果我使用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实际上并没有调用我的类型处理程序,尽管它已被注册.有没有人知道这方面的方法?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。