12

如果有人知道在 .NET 中执行此操作的更多方法,那么您对这些方法有何看法?您选择哪种方法,为什么?

以下是 .NET 中不同对象复制方式的测试。

与此原始线程相关的测试:如何在 c# 中将值从 X 类复制到具有相同属性名称的 Y 类?

所以,在这里,你可以自己运行它:

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);
    }

在我的电脑上测试结果:

测试自动映射器:22322 毫秒

测试隐式运算符:310 ms

测试属性复制:250 毫秒

测试发射映射器:281 毫秒

你可以从这里得到 emit 和 auto 映射器:

http://emitmapper.codeplex.com/

http://automapper.codeplex.com/

4

3 回答 3

4

也可以使用 T4 生成将生成属性复制代码的类。

好:尽可能快地运行 坏:T4 中的“编码” 丑陋:制作允许您一次性编译所有内容的构建脚本

于 2010-11-02T21:52:04.167 回答
1

您是否尝试过重写 Clone 方法来复制对象实例?这样,您将获得一个新的学生对象,如下所示:

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

我发现这种方法是将对象复制到新对象中的最简单方法,尽管我没有进行任何速度测试来了解它与您建议的方法相比的性能如何。

于 2010-11-08T11:21:56.710 回答
1

克隆用于复制相同的类型,而不是从 2 个不同的对象类型复制,然后不能用于此范围。

于 2013-06-20T08:40:04.747 回答