Ответ 1
Я не считаю, что Resharper может это сделать, но Open Source AutoMapper может. Новое в AutoMapper? Просмотрите страницу Начало работы.
Я ищу способ ускорить повторяемую задачу при написании кода. У меня есть 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
Это начинает выглядеть как вызов выходного дня, если кто-то еще его не написал.
Я не считаю, что Resharper может это сделать, но Open Source AutoMapper может. Новое в AutoMapper? Просмотрите страницу Начало работы.
Проголосуйте за этот ответ. Это очень легко. 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;
Это несколько производное от ответа @Jess (его регулярное выражение не работает для меня на VS2013), но вместо использования Visual Studio
я с использованием regex101
Нажмите ссылку выше и просто вставьте свои свойства в поле Test string
, и вы получите их сопоставление.
Regex я использовал
public [A-Za-z\?]* ([A-Za-z0-9]*) .*
и замените
Dest.$1 = Source.$1
надеюсь, что это сэкономит вам некоторое время.
Я согласен с @Ben Griswold.
В большинстве ситуаций Automapper - это путь.
Но когда вы действительно хотите сгенерировать код, который копирует свойства из одного объекта в другой, попробуйте следующее:
Вот простой класс для клонирования объекта. Это не совсем то, о чем вы просили, но, возможно, это будет полезно для вас:
//.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;
}
}
}
}
На основе ответа @Matas я создал более надежную версию с использованием regex101, которая игнорирует дженерики, атрибуты и комментарии и нормализует пробелы.
Regex: *((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*) .*(\n| )*
Заменить: $4 = person.$4,\n
Это та вещь, для которой Cog светит. В основном, Cog - это инструмент создания кода. Код создается через Python.
Простое копирование значений с одной стороны на другую довольно уродливо.
Возможно, вам будет лучше создать метод для включения в ваши классы, который использует отражение для копирования общедоступных свойств. Вы можете сохранить этот метод в resharper для регенерации в другие классы, в которых вам нужна эта функциональность.