Как добавить частичный метод без реализации с использованием CodeDom - PullRequest
5 голосов
/ 29 января 2010
internal List<CodeMemberMethod> createEventHooks()
        {
            string[] eventNames = new string[] { "OnUpdate", "OnInsert", "OnDelete", "OnSelect", "OnSelectAll" };
            List<CodeMemberMethod> eventHooks = new List<CodeMemberMethod>();

            foreach (string eventName in eventNames)
            {
                CodeMemberMethod eventHook = new CodeMemberMethod();
                eventHook.Name = eventName;
                eventHook.Attributes = MemberAttributes.ScopeMask;
                eventHook.ReturnType = new CodeTypeReference("partial void");
            }
            return eventHooks;
        }

производит следующий код:

partial void OnUpdate() {
}

partial void OnInsert() {
}

partial void OnDelete() {
}

partial void OnSelect() {
}

partial void OnSelectAll() {
}

Как я могу заставить CodeDom сбросить "{}", что устранит ошибку компиляции, которую я получаю при попытке компиляции? Я думал о том, чтобы просто использовать CodeSnippetStatement (что я бы предпочел не делать, так как это в первую очередь противоречит цели использования CodeDom), но я не могу найти место в классе CodeTypeDeclaration для добавления фрагментов.

Итак: мне нужно либо

  1. Добавление метода без реализации в класс
  2. Добавление случайного фрагмента в класс
  3. Тайна 3-й вариант

Ответы [ 2 ]

6 голосов
/ 29 января 2010

ОК, вот что я сделал:

    internal List<CodeMemberField> createEventHooks()
    {
        string[] eventNames = new string[] { "OnUpdate()", "OnInsert()", "OnDelete()", "OnSelect()", "OnSelectAll()" };
        List<CodeMemberField> eventHooks = new List<CodeMemberField>();

        foreach (string eventName in eventNames)
        {
            CodeMemberField eventHook = new CodeMemberField(); //do it as a FIELD instead of a METHOD
            eventHook.Name = eventName;
            eventHook.Attributes = MemberAttributes.ScopeMask;
            eventHook.Type = new CodeTypeReference("partial void");
            eventHooks.Add(eventHook);
        }
        return eventHooks;
    }

По сути, я изменил свои методы на поля и включил () s в имена "полей". Все еще хак, но превосходит поиск / замену сгенерированного кода (едва).

0 голосов
/ 29 января 2010

Я столкнулся с этой проблемой, прежде чем пытаться генерировать подписи PInvoke через CodeDom. После долгих исследований я обнаружил, что это невозможно сделать с помощью PInvoke, и я думаю, что то же самое верно для частичных методов.

Лучший способ обойти это - создать файл как есть. Я отметил все методы, которые я намеревался назвать PInvoke по имени. Затем я искал файл, ища эти сигнатуры методов с помощью регулярного выражения, и заменил {}'s точкой с запятой.

Это ужасный хак, но он выполняет свою работу.

...