为了账号安全,请及时绑定邮箱和手机立即绑定

从一个对象列表复制到具有相同结构的另一个对象列表

从一个对象列表复制到具有相同结构的另一个对象列表

C#
德玛西亚99 2022-11-13 16:00:02
如何将所有对象从一个对象列表复制到另一个对象列表。这两个对象具有相同的结构但名称不同。这是代码: class Program{    static void Main(string[] args)    {        List<Test> lstTest = new List<Test>();        List<Test2> lstTest2 = new List<Test2>();        lstTest.Add(new Test { Name = "j", Score = 2 });        lstTest.Add(new Test { Name = "p", Score = 3 });        lstTest2 = lstTest.ConvertAll(x => (Test)x);    }}class Test{    private string name;    private int score;    public string Name    {        get { return name;  }        set { this.name = value; }    }    public int Score    {        get { return score; }        set { this.score = value; }    }}class Test2{    private string name;    private int score;    public string Name    {        get { return name; }        set { this.name = value; }    }    public int Score    {        get { return score; }        set { this.score = value; }    }}我得到的错误是无法将类型隐式转换System.Collections.Generic.List<Test> 为System.Collections.Generic.List<cTest2>
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

如果您不想使用 automapper 或其他映射工具,您可以使用 select 和 new instance 这样做,然后返回一个列表:


lstTest2 = lstTest.Select(e => new Test2()

{

    Score = e.Score,

    Name = e.Name

}).ToList();

在 Automapper 的情况下,您可以执行以下操作:


var config = new MapperConfiguration(cfg => {


    cfg.CreateMap<Test, Test2>();

});

IMapper iMapper = config.CreateMapper();

lstTest2 = iMapper.Map<List<Test>, List<Test2>>(lstTest);

在配置中定义类型转换。将它从一种映射到另一种类型。


您当然可以扩展您的实现以使其通用。


文档参考:


自动映射器:http : //docs.automapper.org/en/stable/Getting-started.html

Expressmapper:http ://expressmapper.org/


查看完整回答
反对 回复 2022-11-13
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您正在尝试隐式转换Test为Test2对象。更正代码的一种简单方法是构造Test2对象:


lstTest2 = lstTest.ConvertAll(x => new Test2 { Name = x.Name, Score = x.Score });

即使底层结构相同,也不能从Testto 转换Test2。如果要显式转换,则必须定义转换运算符:


class Test2 {

    // all code of class Test2


    public static explicit operator Test2(Test v)

    {

        return new Test2 { Name = v.Name, Score = v.Score };

    }

}

然后你可以投ConvertAll:


lstTest2 = lstTest.ConvertAll(x => (Test2)x);


查看完整回答
反对 回复 2022-11-13
?
潇湘沐

TA贡献1816条经验 获得超6个赞

与其拥有两个名称不同的完全不同的对象,不如研究如何进行对象继承。


class Program

{

    static void Main(string[] args)

    {

        List<TestBase> lstTest = new List<TestBase>();


        lstTest.Add(new Test { Name = "j", Score = 2 });

        lstTest.Add(new Test2 { Name = "p", Score = 3 });

    }

}


class TestBase

{

    private string name;

    private int score;


    public string Name

    {

        get { return name;  }

        set { this.name = value; }

    }


    public int Score

    {

        get { return score; }

        set { this.score = value; }

    }

}


class Test : TestBase { }


class Test2 : TestBase { }


查看完整回答
反对 回复 2022-11-13
  • 3 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号