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 отбрасывать"{}
", который разрешит ошибку компилятора, которую я получаю попытку скомпилировать? Я думал о просто использовании a CodeSnippetStatement
(который я не сделал бы, так как это побеждает цель использовать CodeDom во-первых), но я не могу найти место в CodeTypeDeclaration
класс для добавления отрывков.
Так: Я должен также
Хорошо, вот что я сделал:
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;
}
в основном, я изменил свои методы на поля и включал ()
в названиях «поля». Все еще взломать, но бьет поиск / замена сгенерированного кода (едва).
Я столкнулся с этой проблемой до того, как попытался сгенерировать подписи PInvoke через CodeDom. После долгих исследований я обнаружил, что с помощью PInvoke этого достичь невозможно, и думаю, что то же самое, скорее всего, верно и для частичных методов.
Лучшим способом, который я нашел, чтобы обойти это, было сгенерировать файл как есть. Я отметил все методы, которые я намеревался использовать в PInvoke по имени. Затем я искал в файле подписи этих методов с регексом и заменил {}'s
на точку с запятой.
Это ужасный хак, но он делает свою работу.