5
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クラス内にスニペットを追加する場所が見つかりません。

だから:私はどちらかをする必要があります

  1. 実装のないメソッドをクラスに追加する
  2. クラスにランダムなスニペットを追加する
  3. 謎の第3選択肢
4

2 に答える 2

6

OK、これが私がしたことです:

    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 を含めました。まだハックですが、生成されたコードの検索/置換に勝っています (かろうじて)。

于 2010-01-29T20:12:29.717 に答える
0

CodeDom を介して PInvoke 署名を生成しようとする前に、この問題に遭遇しました。多くの調査の結果、PInvoke でこれを達成することは不可能であることがわかりました。部分メソッドについても同じことが当てはまると思います。

これを回避する最善の方法は、ファイルをそのまま生成することでした。PInvoke にするつもりだったすべてのメソッドを名前で書き留めました。次に、正規表現を使用してこれらのメソッド シグネチャを探してファイルを検索し{}'s、セミコロンに置き換えました。

これは恐ろしいハックですが、仕事は完了します。

于 2010-01-29T18:56:52.237 に答える