Использование RegEx для добавления динамического кода в файлы классов

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

public class Something {

//somecode

}

И сделайте так, чтобы это выглядело так:

public class Something {

public static CollectionBase<Something> GetAll() {
return new CollectionBase<Something>(DataLayer.Something.GetAll());

//somecode

}

И я в основном должен сделать это примерно с 200 файлами (среди нескольких других модификаций, но если я могу сделать это, я могу адаптировать его для решения других изменений).

Я не очень хорошо знаком с C #, но думаю, что в псевдокоде это будет примерно так:

  1. Откройте каждый файл .cs в папке
  2. Прочтите каждую строку, пока не найдете совпадение регулярного выражения для: "public class Something"
  3. Поместите совпадение "Something" в строку типа tempS
  4. Вставьте несколько новых строк под ним, например: "public static CollectionBase‹ "+ tempS +"> GetAll () "
  5. Затем запишите новый файл в новую папку.

    Будем очень признательны за любые предложения о том, как написать что-то подобное. Я изучаю C # всего около 3-4 месяцев, и может быть немного сложно синтаксически переваривать все инструкции, которые люди дают друг другу. TIA! -Эван

РЕДАКТИРОВАТЬ: Итак, я уверен, что любой гуру регулярных выражений справился с этим за секунды, но я все равно собираюсь опубликовать здесь свое решение, которое было простой строкой регулярного выражения Найти и заменить:

Найти: открытый класс (\ w *): SimpleObjectBase {

Заменить: [NamedType ("$ 1")] \ r \ n открытый класс $ 1: SimpleObjectBase, ICCPSystemType {\ r \ n \ r \ n #region Static \ r \ n \ r \ n общедоступный статический CollectionBase GetAll () {\ r \ n return new CollectionBase (CCP.Data. $ 1.GetAll ()); \ r \ n} \ r \ n \ r \ n #endregion

А вот пример его работы:

Перед - пространство имен CCP.Logic {

///<summary>
///This class represents each TypeBabySexByULS in the database
///</summary>
[NamedType("TypeBabySexByULS")]
public class TypeBabySexByULS : SimpleObjectBase {

... /// на другой код

После - пространство имен CCP.Logic {

///<summary>
///This class represents each TypeBabySexByULS in the database
///</summary>
[NamedType("TypeBabySexByULS")]
public class TypeBabySexByULS : SimpleObjectBase, ICCPSystemType {

    #region Static

    public static CollectionBase<TypeBabySexByULS> GetAll() {
        return new CollectionBase<TypeBabySexByULS>(CCP.Data.TypeBabySexByULS.GetAll());
    }

    #endregion

/// Надеюсь, это поможет кому-то другому! -E


person Evan Morrison    schedule 28.06.2013    source источник
comment
Я бы предложил использовать Visual Studio Replace Regular Expression Replace. В окне решения отфильтруйте представление, чтобы отображались только файлы. Откройте окна «Найти все» (Ctrl + Shift + F, если я правильно помню). Отфильтруйте свой поиск по расширению файла * .cs и создайте свое регулярное выражение, чтобы оно соответствовало всем вхождениям в области CS-файла отфильтрованного представления решения. Дополнительные сведения о регулярном выражении Visual Studio, группе захвата и о том, как получить к ним доступ в окне замены, см. msdn.microsoft.com/en-us/library/vstudio/2k3te2cs.aspx   -  person Simon Belanger    schedule 28.06.2013
comment
Если вам нужно изменить 200 файлов, чтобы что-то реализовать, у вас может быть более фундаментальная проблема дизайна. Рассматривали ли вы решение с помощью одного из устоявшихся шаблонов проектирования?   -  person itsme86    schedule 28.06.2013
comment
Лучше всего это делать с помощью шаблонов, например T4.   -  person Jeremy Thompson    schedule 28.06.2013
comment
DataLayer - еще один проект в решении, который содержит все соответствующие файлы классов, обеспечивающие доступ к данным. В настоящее время я пытаюсь изменить файлы классов на уровне бизнес-логики. Я пытаюсь понять, как использовать группы захвата, чтобы получить совпадение в строке, чтобы я мог делать свои псевдо-шаги сейчас, с трудом разбираясь в этом :( Я посмотрю на шаблоны (T4), так как у меня есть Понятия не имею, о чем вы говорите.Все это, по сути, произошло потому, что человек, на которого я работаю, сначала создал базу данных, а затем использовал утилиту генерации кода для создания всех классов.   -  person Evan Morrison    schedule 28.06.2013
comment
Я с itsme86. Вместо того, чтобы добавлять один и тот же статический метод к множеству классов, попробуйте один общий статический метод для одного класса уровня данных.   -  person Patrick Hallisey    schedule 28.06.2013
comment
Если вы маршалируете объекты DataLayer через типы бизнес-уровня, ваши возвращаемые типы будут немного нестабильными. Должен ли BusinessLayer.Something.GetAll () возвращать коллекцию BusinessLayer.Something или DataLayer.Something?   -  person Patrick Hallisey    schedule 28.06.2013
comment
хорошо, поэтому все мои классы, которые мне нужно изменить, являются производными от SimpleObjectBase, поэтому, если бы я пошел туда и добавил этот метод, как бы я сделал так, чтобы каждый унаследованный класс создавал свою коллекцию своего собственного типа? например: общедоступная виртуальная CollectionBase ‹This› GetAll () {return new CollectionBase ‹This› (CCP.Data.This.GetAll ()); }   -  person Evan Morrison    schedule 28.06.2013
comment
и Патрик, по сути, DataLayer имеет операторы SQL для получения DataTable, а BusinessLayer ничего не делает в этом сценарии. Я не вижу в этом никакой пользы, кроме разделения проблем ...   -  person Evan Morrison    schedule 28.06.2013
comment
Итак, DataLayer - это ..? пространство имен?   -  person Ken Kin    schedule 28.06.2013
comment
да, у меня есть CCP.Data, CCP.Logic и CCP.Web (в котором есть модели просмотра для любых объектов, поступающих на контроллеры). И CollectionBase - это настраиваемый класс из CCP.Logic.Collections.   -  person Evan Morrison    schedule 28.06.2013
comment
Кажется, я не понимаю вашего дизайна ... извините за то, что не могу помочь. Я позже вернусь, чтобы посмотреть, ответит ли кто-нибудь.   -  person Ken Kin    schedule 28.06.2013


Ответы (1)


Вы пытаетесь выполнить «метапрограммирование».
Прежде всего, вам следует внимательно изучить, решают ли дженерики вашу проблему. Если вы буквально просто извлекаете имена классов, то чистое решение должно быть универсальным.
Для шаблонов T4 я бы рекомендовал взглянуть на пример «Введение в шаблоны T4» из Мета-программирование в .NET, а затем задайте конкретные вопросы.

person weismat    schedule 28.06.2013