Convert/Parse 许多对象使用代码较少的成员方法

Convert/Parse many Objects using a member Method with less Code

有没有简单的方法convert/parseClassFoo的许多对象到classBar的对象,使用[=]的成员方法31=] Bar 喜欢 Bar.loadFromFooObject(Foo classFoo) ?

所以如果我有那 2 个 Classes:

class Foo
{
   public string var1;
   public int var2;
   public List<string> var3;
}

class Bar
{
   public string var1;
   public int var2;
   public float var4;

   public void loadFromFooObject(Foo fooObj)
   {
      this.var1 = fooObj.var1;
      this.var2 = fooObj.var2;
   }
}

这样我就可以避免做:

Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = new Bar[fooObjs.Length];
for (int i = 0; i < fooObjs.Length; i++)
{
   barObjs[i].loadFromFooObject(fooObjs[i]);
}

然后做类似的事情:

Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = fooObjs.Parse(loadFromFooObject);

是否可以使用 C# and/or Linq 实现类似的功能?

类似这样,您只需要创建一个 ConvertToBar 方法,该方法接受一个 Foo 和 returns 一个 Bar。

var barObjs = fooObjs.Select(i=>ConvertToBar(i)).ToArray();

写一个方法TransformFooToBar然后使用linq,例如

var barObjs = fooObjs.Select(n => TransformFooToBar(n)).ToArray(); 

如果你真的想让它成为Barclass上的一个方法,写一个扩展方法,然后linq是这样的:

var barObjs = fooObjs.Select(n => n.TransformFooToBar()).ToArray(); 

我的偏好(这只是个人偏好)是覆盖显式强制转换运算符,只从一种类型强制转换为另一种类型。将其与 Kye 的答案结合起来处理多个对象。

我对任何类型的对象都经常使用这种策略conversion/mapping:

  • 为单个对象转换创建函数
  • 创建一个接受 IEnumerable 的重载(对我来说通常是一个列表)并使用 LINQ .Select to convert the entire list into. It codes seamlessly since the single object conversion is, by definition, a Func. See this SO answer 获得关于 Func 的更多解释。

您还可以通过在静态 class 中创建一些扩展方法来了解扩展方法。对于您的具体情况,扩展方法可能如下所示:

public static class ExtensionMethods
{
    public static Bar ToBar(this Foo foo)
    {
        var bar = new Bar();
        bar.loadFromFooObject(foo);
        //you could also move the logic to convert from the Bar class in here
        return bar;
    }

    //Overload for a collection of Foos (like Foo[] or List<Foo>)
    public static IEnumerable<Bar> ToBars(this IEnumerable<Foo> foos)
    {
        //Since ToBar is a Func<Foo, Bar>
        return foos.Select(ToBar);
        //alternate lambda syntax:  return foos.Select(foo => foo.ToBar());
    }
}

您可以这样调用这些方法:

var fooList = new List<Foo>();
var barEnumerable = fooList.ToBars();