• Microsoft .NET
  • LINQ
  • Часто задаваемые вопросы о LINQ - часть вторая

LINQtoSQL: Модификация в соответствии с требованиями код, генерируемый конструктором - Сценарий 1 – Небольшие изменения

ОГЛАВЛЕНИЕ

Сценарий 1 – Небольшие изменения

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

Файл DBML, расположенный в папке Сценарий1 в бизнес-проекте, связан с классом CustomizeDesigners\Scenario1\CustSmallChangesToDefaultLINQtoSQL. Код, выполняющий требуемые изменения, довольно простой:

public class SmallChangesToDefaultLINQtoSQL : Generators.CodeRenderer
{
    /// <summary>
    /// Устанавливаемое по умолчанию средство изменения в соответствии с требованиями //пользователя для файлов dbml.
    /// </summary>
    public const string CustomToolName = "MSLinqToSQLGenerator";
   
    public override Generators.RenderResults Render()
    {
        // запустить установленное по умолчанию средство изменения.
        byte[] resultsAsBytes = base.RunOtherCustomTool(CustomToolName);
        // получить сгенерированный Microsoft код как строку.
        string results = System.Text.Encoding.Default.GetString(resultsAsBytes);
        // преобразовать строку.
        string modifiedResults = AddSomething(results); // AddAttribute(results) //добавить атрибут;
        // вернуть строку и сохранить ее в файле .Designer.cs.
        return new Generators.RenderResults(modifiedResults);
    }

    private string AddSomething(string results)
    {
        results = string.Format(@"// -------------------------------------------------------
// Automatically generated.
// Generation date: {0}
// Generated by: {1}
// -------------------------------------------------------
{2}",
                       System.DateTime.Now.ToString("yyyy-MM-dd hh:mm"),
                       System.Security.Principal.WindowsIdentity.GetCurrent().Name,
                       results);
            return results;
        }
    }

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

Для проверки отредактируйте файл Business\Scenario1\CustomersLINQ.dbml в проекте Бизнес, сохраните его, раскройте список его потомков и откройте файл Business\Scenario1\CustomersLINQ.Designer.cs. Можно увидеть, что файл содержит дополнительный код, добавленный к коду Microsoft.

Для отладки установите точку останова в методе Render, запустите сеанс отладки, загрузите то же самое решение во второй экземпляр Visual Studio и выполните такие же действия, как и при тестировании примера.

Пример генератора кода имеет другой метод, AddAttribute, который показывает, как выполнять немного более сложные действия. Вы можете использовать регулярные выражения, если требуемые изменения более сложные.