Как настроить генерацию кода для InitializeComponent? В частности, как я могу опубликовать -обработку всего сгенерированного кода?

Я пытаюсь настроить генерацию кода конструктора Windows Forms для InitializeComponent. Статья MSDN «Настройка Генерация кода в.NET Framework Visual Designers» содержит раздел «Управление генерацией кода» , в котором объясняются основы того, как это можно сделать.

Я внимательно следил за примером в статья выше:

//using System.ComponentModel.Design.Serialization;

class SomeFormSerializer : CodeDomSerializer
{
    public override object Serialize(IDesignerSerializationManager manager,
                                     object value)
    {
        // first, let the default serializer do its work:
        var baseSerializer = (CodeDomSerializer)manager.GetSerializer(
                             typeof(Form).BaseType, typeof(CodeDomSerializer));
        object codeObject = baseSerializer.Serialize(manager, value);

        // then, modify the generated CodeDOM -- add a comment as the 1st line:
        if (codeObject is CodeStatementCollection)
        {
            var statements = (CodeStatementCollection)codeObject;
            statements.Insert(0, new CodeCommentStatement("CODEDOM WAS HERE"));
        }

        // finally, return the modified CodeDOM:
        return codeObject;
    }
}

Теперь я подключаю это к своей формеSomeForm:

[DesignerSerializer(typeof(SomeFormSerializer), typeof(CodeDomSerializer))]
class SomeForm : Form { … }

Конструктор форм может сгенерировать следующий InitializeComponentкод:

private void InitializeComponent()
{
    … /* (general setup code, such as a call to `this.SuspendLayout`) */ 

    // 
    // someButton
    // 
    … /* (someButton's properties are set) */

    // CODEDOM WAS HERE!
    // 
    // SomeForm
    // 
    … /* (form's properties are set) */

    … /* (general setup code, such as a call to `this.ResumeLayout`) */ 
}

Обратите внимание, что комментарий // CODEDOM WAS HEREне был добавлен в качестве самой первой строки в InitializeComponent, но только как первая строка блока кода, который имеет дело со свойствами самого объекта формы.

Что бы я должен был сделать, если бы я хотел иметь возможность модифицировать сгенерированный CodeDOM всего метода, а не только части, связанной с конкретным объектом?

Предыстория :Зачем мне это нужно? В Windows Forms, если нужно гибкое преобразование значений при привязке данных, обычно приходится прибегать к подписке на события Formatи Parseкакого-то конкретного объекта Binding. Итак, я создаю специализированный Bindingподкласс (, назовем его ConvertingBinding), который немного упрощает этот процесс.

Теперь проблема заключается в том, что при настройке привязки данных в конструкторе Windows Forms сгенерированный код создает экземпляры Binding; однако я бы хотел, чтобы дизайнер вместо этого создавал экземпляр моего специализированного подкласса. Мой текущий подход заключается в том, чтобы позволить разработчику сначала создать дерево CodeDOM, затем пройтись по этому дереву и заменить все экземпляры Bindingэкземплярами ConvertingBinding.

10
задан stakx supports GoFundMonica 22 April 2012 в 21:11
поделиться