代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

如何添加不使用codedom实现的分部方法

  •  5
  • Chris McCall  · 技术社区  · 14 年前
    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. 神秘第三选择
    2 回复  |  直到 14 年前
        1
  •  6
  •   Chris McCall    14 年前

    好吧,我是这样做的:

        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;
        }
    

    基本上,我将我的方法改为字段,并包括 () 在“字段”名称中。仍然是一个黑客,但比搜索/替换生成的代码(勉强)要好。

        2
  •  0
  •   JaredPar    14 年前

    在尝试通过codedom生成pinvoke签名之前,我遇到了这个问题。经过大量的调查,我发现用pinvoke是不可能做到这一点的,我认为部分方法也是如此。

    我发现解决这个问题的最佳方法是按原样生成文件。我注意到了所有我打算以名字命名的方法。然后,我在文件中搜索使用regex的方法签名,并替换 {}'s 用分号。

    这是一个可怕的黑客,但它能完成任务。