【问题标题】:Automapper String to Guid not working自动映射器字符串到 Guid 不起作用
【发布时间】:2017-07-21 15:43:59
【问题描述】:

我想创建一个通用类型转换器,它可以将 Guid 转换为字符串,并将字符串转换为 Guid,具体取决于我要转换的方向(DTO > VM 或 VM > DTO)。此外,一些属性具有可为空的 Guid,所以我认为我也可以处理它。我没有运气尝试了以下方法:

CreateMap<string, Guid?>().ConvertUsing(value => !string.IsNullOrEmpty(value) ? Guid.Parse(value) : (Guid?)null);
CreateMap<string, Guid>().ConvertUsing(guid => Guid.Parse(guid));

CreateMap<Guid?, string>().ConvertUsing(guid => guid?.ToString("N"));
CreateMap<Guid, string>().ConvertUsing(guid => guid.ToString("N"));

关于如何让它发挥作用的任何建议?

【问题讨论】:

  • 为什么你的尝试没有成功?不编译,哪个错误?在运行时不起作用,哪个异常?
  • 您使用的是什么版本的自动映射器?不久前记录了一个关于此的问题:github.com/AutoMapper/AutoMapper/issues/523
  • 使用 v6.1.1。不是自动映射器返回的错误。我只是在属性上获得了一个空引用,因为它没有将字符串转换为 GUID。

标签: c# .net-core automapper guid


【解决方案1】:

这适用于我的电脑:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<string, Guid>().ConvertUsing(s => Guid.Parse(s));
    cfg.CreateMap<string, Guid?>().ConvertUsing(s => String.IsNullOrWhiteSpace(s) ? (Guid?)null : Guid.Parse(s));
    cfg.CreateMap<Guid?, string>().ConvertUsing(g => g?.ToString("N"));
    cfg.CreateMap<Guid, string>().ConvertUsing(g => g.ToString("N"));
});

var guid = Guid.NewGuid();
var guidStr = Guid.NewGuid().ToString();

var guid1 = Mapper.Map<Guid>(guidStr);     // The guid is parsed successfully
var guid2 = Mapper.Map<Guid?>(null);       // Gets null as expected
var str1 = Mapper.Map<string>(guid);       // The guid is serialized successfully
var str2 = Mapper.Map<string>(null);       // Gets null as expected

您是否像这样使用Initialize 方法配置您的映射器?

它也可以使用Mapper.Instance.Map 方法而不是直接使用Mapper.Map

【讨论】:

    【解决方案2】:

    如果默认字符串格式足够好,则默认情况下双向都有效,不需要类型转换器。

    【讨论】:

    • 默认映射仅适用于 Guid,不适用于可空类型 (Guid?)。
    • 这也可以,也许您使用的是旧版本。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多