猿问

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

如何将所有对象从一个对象列表复制到另一个对象列表。这两个对象具有相同的结构但名称不同。


这是代码:


 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>


德玛西亚99
浏览 150回答 3
3回答

MMMHUHU

如果您不想使用 automapper 或其他映射工具,您可以使用 select 和 new instance 这样做,然后返回一个列表:lstTest2 = lstTest.Select(e => new Test2(){&nbsp; &nbsp; Score = e.Score,&nbsp; &nbsp; Name = e.Name}).ToList();在 Automapper 的情况下,您可以执行以下操作:var config = new MapperConfiguration(cfg => {&nbsp; &nbsp; cfg.CreateMap<Test, Test2>();});IMapper iMapper = config.CreateMapper();lstTest2 = iMapper.Map<List<Test>, List<Test2>>(lstTest);在配置中定义类型转换。将它从一种映射到另一种类型。您当然可以扩展您的实现以使其通用。文档参考:自动映射器:http : //docs.automapper.org/en/stable/Getting-started.htmlExpressmapper:http ://expressmapper.org/

哆啦的时光机

您正在尝试隐式转换Test为Test2对象。更正代码的一种简单方法是构造Test2对象:lstTest2 = lstTest.ConvertAll(x => new Test2 { Name = x.Name, Score = x.Score });即使底层结构相同,也不能从Testto 转换Test2。如果要显式转换,则必须定义转换运算符:class Test2 {&nbsp; &nbsp; // all code of class Test2&nbsp; &nbsp; public static explicit operator Test2(Test v)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return new Test2 { Name = v.Name, Score = v.Score };&nbsp; &nbsp; }}然后你可以投ConvertAll:lstTest2 = lstTest.ConvertAll(x => (Test2)x);

潇湘沐

与其拥有两个名称不同的完全不同的对象,不如研究如何进行对象继承。class Program{&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; List<TestBase> lstTest = new List<TestBase>();&nbsp; &nbsp; &nbsp; &nbsp; lstTest.Add(new Test { Name = "j", Score = 2 });&nbsp; &nbsp; &nbsp; &nbsp; lstTest.Add(new Test2 { Name = "p", Score = 3 });&nbsp; &nbsp; }}class TestBase{&nbsp; &nbsp; private string name;&nbsp; &nbsp; private int score;&nbsp; &nbsp; public string Name&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get { return name;&nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; set { this.name = value; }&nbsp; &nbsp; }&nbsp; &nbsp; public int Score&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get { return score; }&nbsp; &nbsp; &nbsp; &nbsp; set { this.score = value; }&nbsp; &nbsp; }}class Test : TestBase { }class Test2 : TestBase { }
随时随地看视频慕课网APP
我要回答