Подтвердить что ты не робот

Может ли ReSharper генерировать код, который копирует свойства с одного объекта на другой?

Я ищу способ ускорить повторяемую задачу при написании кода. У меня есть ReSharper, и я думаю, что настройка может делать то, что мне нужно.

У меня есть два объекта одного типа. Я хочу скопировать все общедоступные свойства одного объекта на другой объект. Я хочу, чтобы инструмент, ReSharper в этом случае, создал код для меня. Я расскажу им имена первого объекта и второго объекта. Я хочу, чтобы он обнаружил все общедоступные свойства первого объекта и скопировал значения во второй объект.

Здесь тип кода, который я ищу, сгенерирован с помощью инструмента, такого как ReSharper:

foo.Name = moo.Name;
foo.Age = moo.Age;
foo.City = moo.City;

Автоматизация этого простого кода, который копирует значения справа налево, сэкономит массу времени, и я думаю, что ReSharper может это сделать. Тем не менее, я не видел ничего всплывающего в поиске его, хотя.

Я не ищу метод генерации кода CodeSmith или шаблон T4, потому что я хочу, чтобы он генерировал эти конкретные строки внутри моего класса, а не генерировал и весь класс или отдельный файл.

Кто-нибудь знает способ нажать несколько нажатий клавиш, ввести имена объектов "foo" и "moo" выше и заставить инструмент сгенерировать эти копии справа налево строки кода?

Обновление:

Я нашел некоторую документацию по созданию расширений для ReSharper, и это, вероятно, может быть достигнуто с помощью этого пути, но оно действительно работает.

http://www.jetbrains.net/confluence/display/ReSharper/PowerToys+Pack+3.0+User+Guide

Это начинает выглядеть как вызов выходного дня, если кто-то еще его не написал.

4b9b3361

Ответ 1

Я не считаю, что Resharper может это сделать, но Open Source AutoMapper может. Новое в AutoMapper? Просмотрите страницу Начало работы.

Ответ 2

Проголосуйте за этот ответ. Это очень легко. ReSharper не делает этого, но вы можете использовать супер-пупер REGEX!

В Visual Studio...

    public string Email { get; set; }
    public string CellPhone { get; set; }
    public int NumChildren { get; set; }
    public DateTime BirthDate { get; set; }
  • Выберите все свои свойства. Нажмите CTRL-D для копирования.

  • Теперь нажмите CTRL-H для замены. Убедитесь, что для соответствия Regex выбрано .*.

  • Заменить: public [\w?]* (\w*) .* (Возможно, это правило должно быть изменено)

  • С: dest.$1 = source.$1;

Теперь у вас есть красивый код, который вы можете поместить в выбранный вами метод:

    dest.Email = source.Email;
    dest.CellPhone = source.CellPhone;
    dest.NumChildren = source.NumChildren;
    dest.BirthDate = source.BirthDate;

Ответ 3

Это несколько производное от ответа @Jess (его регулярное выражение не работает для меня на VS2013), но вместо использования Visual Studio я с использованием regex101

Нажмите ссылку выше и просто вставьте свои свойства в поле Test string, и вы получите их сопоставление.

Regex я использовал

public [A-Za-z\?]* ([A-Za-z0-9]*) .*

и замените

Dest.$1 = Source.$1

надеюсь, что это сэкономит вам некоторое время.

Ответ 4

Я согласен с @Ben Griswold.
В большинстве ситуаций Automapper - это путь.

Но когда вы действительно хотите сгенерировать код, который копирует свойства из одного объекта в другой, попробуйте следующее:

  • Создайте новый класс и создайте класс, из которого вы хотите скопировать свойства.
  • Щелкните этот новый производный класс правой кнопкой мыши и выберите "Refactor > Extract Interface".
  • Проверьте все свойства, которые вы хотите скопировать.
  • Выберите "Место рядом", потому что этот интерфейс будет только временным.
  • Нажмите "Далее".
  • Измените свой производный класс, чтобы вы больше не наследовали от базового класса, и вы только реализуете свой новый интерфейс. Ожидайте увидеть красную фигуру.
  • Наведите курсор на красную стрелку и нажмите "ALT-ENTER", чтобы "выполнить элементы".
  • Нажмите "Готово".
  • Удалите этот временный интерфейс и измените свой класс, чтобы он больше не выполнял его.

Ответ 5

Вот простой класс для клонирования объекта. Это не совсем то, о чем вы просили, но, возможно, это будет полезно для вас:

//.Net 2.0
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace YourNameSpace {
   public static class ObjectCloner {
      public static T Clone<T>(T obj) {
         using (MemoryStream buffer = new MemoryStream()) {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(buffer, obj);
            buffer.Position = 0;
            T temp = (T)formatter.Deserialize(buffer);
            return temp;
         }
      }
   }
}

Ответ 6

На основе ответа @Matas я создал более надежную версию с использованием regex101, которая игнорирует дженерики, атрибуты и комментарии и нормализует пробелы.

Regex: *((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*) .*(\n| )*

Заменить: $4 = person.$4,\n

Ответ 7

Это та вещь, для которой Cog светит. В основном, Cog - это инструмент создания кода. Код создается через Python.

Ответ 8

Простое копирование значений с одной стороны на другую довольно уродливо.

Возможно, вам будет лучше создать метод для включения в ваши классы, который использует отражение для копирования общедоступных свойств. Вы можете сохранить этот метод в resharper для регенерации в другие классы, в которых вам нужна эта функциональность.