如何根据运行时条件忽略属性?

2023-11-21

我有一对简单的类,我在初始化时设置了映射。

public class Order {
  public int ID { get; set; }  
  public string Foo { get; set; }
}

public class OrderDTO {
  public int ID { get; set; }
  public string Foo { get; set; }
}

...

Mapper.CreateMap<Order, OrderDTO>();

现在在某个点我需要映射一个Order to an OrderDTO。但根据某些情况,我可能需要忽略Foo测绘期间。我们还假设我无法将条件“存储”在源或目标对象中。

我知道如何在初始化时配置被忽略的属性,但我不知道如何实现这样的动态运行时行为。

任何帮助,将不胜感激。

UPDATE

我的这种行为的用例是这样的。我有一个 ASP.NET MVC Web 网格视图,它显示以下列表OrderDTOs。用户可以单独编辑单元格值。网格视图将编辑后的数据发送回服务器,就像一组数据OrderDTOs,但仅设置编辑的字段值,其他保留为默认值。它还发送有关为每个主键编辑哪些字段的数据。现在,从这个特殊场景中,我需要将这些“半空”对象映射到Orders,但是当然,跳过那些没有为每个对象编辑的属性。

另一种方法是进行手动映射,或者以某种方式使用反射,但我只是在考虑是否可以以某种方式使用 AutoMapper。


我深入研究了 AutoMapper 源代码和示例,发现有一种方法可以在映射时传递运行时参数。

快速示例设置和使用如下所示。

public class Order {
  public int ID { get; set; }  
  public string Foo { get; set; }
}

public class OrderDTO {
  public int ID { get; set; }
  public string Foo { get; set; }
}

...

Mapper.CreateMap<Order, OrderDTO>()
  .ForMember(e => e.Foo, o => o.Condition((ResolutionContext c) => !c.Options.Items.ContainsKey("IWantToSkipFoo")));

...

var target = new Order();
target.ID = 2;
target.Foo = "This should not change";

var source = new OrderDTO();
source.ID = 10;
source.Foo = "This won't be mapped";

Mapper.Map(source, target, opts => { opts.Items["IWantToSkipFoo"] = true; });
Assert.AreEqual(target.ID, 10);
Assert.AreEqual(target.Foo, "This should not change");

事实上,这看起来相当“技术性”,但我仍然认为有很多用例这确实很有帮助。如果根据应用程序的需要来概括这个逻辑,并包装到一些扩展方法中,例如,那么它可能会更清晰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据运行时条件忽略属性? 的相关文章

随机推荐