Object copy approaches in .net: Auto Mapper, Emit

2020-02-09 08:58发布

问题:

If some one knows any more ways of doing this in .NET and also what is your opinions about that approaches? Which approach you choose and why?

Here is the tests of different ways of object copy in .NET.

Tests Related to this original thread: How to copy value from class X to class Y with the same property name in c#?

So, here it is, you can run it yourself:

static void Main(string[] args)
    {
        Student _student = new Student();
        _student.Id = 1;
        _student.Name = "Timmmmmmmmaaaahhhh";
        _student.Courses = new List<int>();
        _student.Courses.Add(101);
        _student.Courses.Add(121);

        Stopwatch sw = new Stopwatch();

        Mapper.CreateMap<Student, StudentDTO>();            

        StartTest(sw, "Auto Mapper");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO dto = Mapper.Map<Student, StudentDTO>(_student);
        }

        StopTest(sw);

        StartTest(sw, "Implicit Operator");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO itemT = _student;
        }

        StopTest(sw);

        StartTest(sw, "Property Copy");

        for (int i = 0; i < 1000000; i++)
        {

            StudentDTO itemT = new StudentDTO
            {
                Id = _student.Id,
                Name = _student.Name,
            };

            itemT.Courses = new List<int>();
            foreach (var course in _student.Courses)
            {
                itemT.Courses.Add(course);
            }
        }

        StopTest(sw);

        StartTest(sw, "Emit Mapper");

        ObjectsMapper<Student, StudentDTO> emitMapper = ObjectMapperManager.DefaultInstance.GetMapper<Student, StudentDTO>();

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO itemT = emitMapper.Map(_student);
        }

        StopTest(sw);
    }

Tests results on my PC:

Test Auto Mapper:22322 ms

Test Implicit Operator:310 ms

Test Property Copy:250 ms

Test Emit Mapper:281 ms

You can get emit and auto -mappers from here:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

回答1:

It is also possible to use T4 to generate classes that will generate property copy code.

Good: runs as fast as it is possible Bad: "coding" in T4 Ugly: Making build scripts that allow you to compile it all in one go



回答2:

Have you tried overriding the Clone method to copy object instances? This way, you get a new student object like this:

for (int i = 0; i < 1000000; i++) 
{ 
     StudentDTO itemT = _student.Clone(); 
}

I find this approach the easiest way of copying objects into new objects, though I haven't done any speed tests to find out how well it performs against the methods you suggest.



回答3:

the Clone is for copy the same Type not for copying from 2 different objects Type then can't be used for this scope.