【问题标题】:Mapping two classes in c#在 C# 中映射两个类
【发布时间】:2015-09-08 13:20:38
【问题描述】:

我有两节课

public class foo1
{
  public int id;
  public string image_link;
  public string sale_price;
}

public class foo2
{
 public int Id;
 public string ImageLink;
 public string SalePrice
}

属性值仅通过下划线和大小写不同。我需要映射这两个类。

现在我正在尝试这样的事情及其工作:

//var b = object of foo2
var a = new foo1{
 a.id = b.Id,
 a.image_link = b.ImageLink,
 a.sale_price = b.SalePrice
}

我听说过 AutoMapper,但我不清楚我将如何使用它,或者在哪里可以选择忽略大小写或下划线。还是有更好的解决办法?

【问题讨论】:

  • 您可以阅读有关 AutoMapper 的教程或阅读文档,它非常简单,对于更复杂的示例,文档甚至显示了如何完成更高级的配置。
  • 您目前的方法到底有什么问题?它有效,不是吗?然而,另一种选择是在您的任何类中创建某种转换方法或定义用户转换。
  • 你在用 ASP.NET 做这些吗?那么就很简单了。
  • 老实说,我对 Automapper 一无所知,但我只记得我曾经看过这篇文章,也许它可以帮助您决定支持/反对 AutoMapper:uglybugger.org/software/post/…
  • 下面是一种使用下划线映射的全局方法:stackoverflow.com/questions/1630012/automapper-mapping(全局不是每个配置文件)

标签: c# entity-framework automapper


【解决方案1】:

您的代码很好,可以按预期工作。

我个人建议您不要使用自动映射器。关于为什么,网上有很多解释,比如一个:http://www.uglybugger.org/software/post/friends_dont_let_friends_use_automapper

基本上,主要问题是如果您重命名 foo1 对象上的某些属性而不修改 foo2 对象,您的代码将在运行时静默失败。

【讨论】:

  • 是的“不要使用AutoMapper,容易出错” 有点牵强。无论如何,使用一种或另一种方式,您都需要单元测试来测试两种方式的映射,就像手动方式一样,很容易忘记属性或复制粘贴错误。
  • @CodeCaster 公平点,但我会说这是个人喜好。如果某些重构出错,我个人总是更喜欢(如果可能的话)我的代码根本不编译,而不是期望某些单元测试失败(这并不妨碍编写单元测试,但我更喜欢我的编译在调用之前失败他们)。
  • 如果您忘记映射您现在重命名的属性,它仍然会编译。 :)
  • @CodeCaster 当然,这就是为什么单元测试仍然很重要,正如您所指出的那样:) 但是如果无法重命名这两个属性,仍然可以使用 automapper 进行编译,另一方面,它不会使用手动映射进行编译。
  • 感谢@ken2k 的建议。我决定继续我的方法。:)
【解决方案2】:

作为@ken2k 的回答,我建议您不要使用对象映射器。

如果您想保存代码,您可以为映射创建一个新方法(或直接在构造函数中)。

public class foo1
{
  public int id;
  public string image_link;
  public string sale_price;

  public void map(foo2 obj)
  {
    this.id = obj.Id;
    this.image_link = obj.ImageLink;
    this.sale_price = obj.SalePrice;
  }
}

然后

//var b = object of foo2
var a = new foo1();
a.map(b);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多