Может ли ReSharper генерировать код, который копирует свойства из одного объекта в другой? - PullRequest
37 голосов
/ 04 августа 2009

Я ищу способ ускорить повторяющуюся задачу при написании кода. У меня есть 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

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

Ответы [ 8 ]

53 голосов
/ 02 июля 2014

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

В Visual Studio:

    public string Email { get; set; }
    public string CellPhone { get; set; }
    public int NumChildren { get; set; }
    public DateTime BirthDate { get; set; }
  1. Выберите все ваши свойства. Нажмите CTRL-D , чтобы скопировать.

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

  3. Заменить: public [\w?]* (\w*) .* (Это регулярное выражение может потребоваться настроить)

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

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

    dest.Email = source.Email;
    dest.CellPhone = source.CellPhone;
    dest.NumChildren = source.NumChildren;
    dest.BirthDate = source.BirthDate;
11 голосов
/ 06 января 2015

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

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

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

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

и заменить

Dest.$1 = Source.$1

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

9 голосов
/ 04 августа 2009

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

4 голосов
/ 10 декабря 2011

Я согласен с @Ben Griswold.
В большинстве случаев Automapper - это то, что нужно.

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

  1. Создайте новый класс и наследуйте от класса, из которого вы хотите скопировать свойства.
  2. Щелкните правой кнопкой мыши по этому новому производному классу и выберите «Refactor> Extract Interface».
  3. Отметьте все свойства, которые вы хотите скопировать.
  4. Выберите «Поместить рядом», потому что этот интерфейс будет только временным.
  5. Нажмите «Далее».
  6. Измените свой производный класс, чтобы вы больше не наследовали от базового класса и реализовывали только свой новый интерфейс. Ожидайте увидеть красную загогулину.
  7. Поместите курсор на красное загогулины и нажмите «ALT-ENTER», чтобы «Участники внедрения».
  8. Нажмите «Готово».
  9. Удалите этот временный интерфейс и измените ваш класс так, чтобы вы больше не реализовывали его.
1 голос
/ 25 октября 2017

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

Регулярное выражение: *((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*).*(\n| )*

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

1 голос
/ 04 августа 2009

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

//.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;
         }
      }
   }
}
0 голосов
/ 04 августа 2009

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

0 голосов
/ 04 августа 2009

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

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

...