3

CodeCompileUnitを使用してCodeDOMを介してコードを生成する場合、タイプを定義している名前空間とは別にCodeNamespaceを作成することにより、名前空間をインポートできます。Importsプロパティを使用すると、必要な名前空間を追加できます。CodeNamespaceをCodeCompileユニットに追加すると、インポートはCodeDOMによって生成されたファイルの上部に表示されます。

たとえば、CSharpCodeProviderを使用して、次のCodeDOMグラフをコンパイルします。

CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeNamespace importsNamespace = new CodeNamespace {Imports = {new CodeNamespaceImport("System"), new CodeNamespaceImport("System.Collections.Generic"), new CodeNamespaceImport("System.Linq")}};
CodeNamespace typeNamespace = new CodeNamespace("MyTypeNamespace");
compileUnit.Namespaces.Add(importsNamespace);
compileUnit.Namespaces.Add(typeNamespace);

生成されます

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.269
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyTypeNamespace {

}

CodeSnippetCompileUnitを使用すると、文字列として入力された型定義をコンパイルできます。たとえば、文字列「public class TestClass {}」は、CodeSnippetCompileUnitの値として使用できます。上記と同じコードをCodeSnippetCompileUnitで使用します。

const string testClassCodeString = "public class TestClass {}";
CodeSnippetCompileUnit snippetCompileUnit = new CodeSnippetCompileUnit {Value = testClassCodeString};
CodeNamespace importsNamespace = new CodeNamespace {Imports = {new CodeNamespaceImport("System"), new CodeNamespaceImport("System.Collections.Generic"), new CodeNamespaceImport("System.Linq")}};
CodeNamespace typeNamespace = new CodeNamespace("MyTypeNamespace");
compileUnit.Namespaces.Add(importsNamespace);
compileUnit.Namespaces.Add(typeNamespace);

以下のみを含むファイルを生成します。

public class TestClass {}

このタイプを名前空間で囲む、またはCodeSnippetCompileUnitから生成されたファイルに名前空間をインポートするにはどうすればよいですか?

4

1 に答える 1

2

CodeSnippetCompileUnitはCodeCompileUnitから派生していますが、コンパイラはCodeDOMグラフからコードを生成するときにNamespacesプロパティを無視します。CodeSnippetCompileUnitから生成されたコードには、オブジェクトのValueプロパティにある文字列のみが含まれます。

文脈自由コードスニペットがある場合、名前空間をインポートするか、名前空間でスニペットを囲む唯一のオプションは、CodeSnippetCompileUnitの値を設定する前に文字列を変更することです。

上記の質問のコードを出発点として使用する例:

string namespaceString = "MyTypeNamespace";
string codeString = "public class TestClass {}";
string snippetValue = string.Format(@"
using System;
using System.Collections.Generic;
using System.Linq;

namespace {0}
{{

{1}

}}", namespaceString, codeString, Environment.NewLine);

var snippetCompileUnit = new CodeSnippetCompileUnit {Value = snippetValue};

これにより、以下が生成されます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyTypeNamespace
{

public class TestClass {}

}
于 2012-07-18T23:16:43.327 に答える