Копировать из одного списка объектов в другой с той же структурой - PullRequest
0 голосов
/ 26 марта 2019

Как скопировать все из одного списка объектов в другой. Оба объекта имеют одинаковую структуру, но разные имена.

Вот код:

 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 ]

2 голосов
/ 26 марта 2019

Если вы не хотите использовать 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);

в конфигурации вы определяете тип преобразования.Преобразуйте его из одного в другой тип.

Вы, конечно, можете расширить свою реализацию, чтобы сделать ее универсальной.

Ссылка на документацию:

2 голосов
/ 26 марта 2019

Вы пытаетесь неявно преобразовать Test в Test2 объекты.Простой способ исправить ваш код - это создать Test2 объекты:

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

Даже если базовая структура идентична, вы не можете привести от Test до 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);
0 голосов
/ 26 марта 2019

Вместо того чтобы иметь два совершенно разных объекта с разными именами, изучите, как создать объект Наследование .

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 { }
...