Инверсия равенства в Visual Studio

Posted: Октябрь 14, 2010 in .NET

Разрабатывая обмен данными с интерфейсом (дискусии по поводу model-view-presenter уместны, но главное понять суть), часто приходится сначала писать код типа

tbFirstName.Text = person.FirstName;
tbLastName.Text = person.LastName;
tbAge.Text = person.Age;

А затем

person.FirstName = tbFirstName.Text;
person.LastName = tbLastName.Text;
person.Age = tbAge.Text;

Хорошо, что на работе у меня есть CodeRush Xpress, в многочисленных функция которого есть перевернуть равенство. Но дома у меня такого инструмента нет, а пиратский софт ставить не хочется. Можно написать отдельную программку для такого обращения, а можно написать Add-in для студии, чем мы и займемся. Идея алгоритма проста: при помощи регулярных выражений разбить выделенные строки по «;», а затем полученные строки разбить по «=» и обратить.
Начнем с создания нового проекта. В списке проектов выберем тип проекта Add-in. Назовем его ReverseEquation. Поставим галочку, чтобы он появился в меню Tools. В классе Connect будем много сгенерированного кода. Нам нужен метод Exec. Выделенный текст нам доступен через свойсто (_applicationObject.ActiveDocument.Object(«») as TextDocument).Selection.Text. Весь текст метода будет выглядеть следующим образом

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
	handled = false;
	if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
	{
		if(commandName == "ReverseEquation.Connect.ReverseEquation")
		{
			object obj = _applicationObject.ActiveDocument.Selection;
			string selectedText = (_applicationObject.ActiveDocument.Object("") as TextDocument).Selection.Text;
			string[] sentencies = Regex.Split(selectedText, ";");
			string[] reverseSentencies = new string[sentencies.Length];
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < sentencies.Length; i++)
			{
				string[] sentence = Regex.Split(sentencies[i], "=");
				//последний элемент будет пустой
				if (sentence.Length > 1)
				{
					//не забываем почистить
					sentence[1] = sentence[1].Trim().Replace("\n", "").Replace("\r", "").Replace("\t", "");
					sentence[0] = sentence[0].Trim().Replace("\n", "").Replace("\r", "").Replace("\t", "");

					sb.Append(sentence[1]).Append("=").Append(sentence[0]).Append(";\n");
				}
			}

			(_applicationObject.ActiveDocument.Object("") as TextDocument).Selection.Text = sb.ToString();

			handled = true;
			return;
		}
	}
}

Это, конечно, очень примитивный код, но для меня очень полезный. Исходные коды доступны по ссылке http://equationinversion.codeplex.com/

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s