【问题标题】:How to add a partial method without an implementation using CodeDom如何使用 CodeDom 添加没有实现的部分方法
【发布时间】:2010-01-29 16:55:45
【问题描述】:
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 类中找不到添加 sn-ps 的位置.

所以:我需要要么

  1. 向类添加无实现方法
  2. 向类添加随机 sn-p
  3. 神秘的第三个选项

【问题讨论】:

    标签: c# codedom partial-methods


    【解决方案1】:

    好的,这就是我所做的:

        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 包含在“字段”名称中。仍然是一个 hack,但胜过搜索/替换生成的代码(几乎没有)。

    【讨论】:

    • 一个非常聪明的黑客!
    【解决方案2】:

    在尝试通过 CodeDom 生成 PInvoke 签名之前,我遇到了这个问题。经过大量调查后,我发现使用 PInvoke 无法实现这一点,我认为部分方法可能也是如此。

    我发现解决此问题的最佳方法是按原样生成文件。我注意到所有我打算按名称作为 PInvoke 的方法。然后,我在文件中搜索使用正则表达式查找那些方法签名,并将{}'s 替换为分号。

    这是一个可怕的 hack,但它可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-28
      • 2015-12-19
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2017-05-15
      相关资源
      最近更新 更多