2012-07-18 3 views
2

CodeCompileUnit을 사용하여 CodeDOM을 통해 코드를 생성 할 때 유형을 정의하는 네임 스페이스와 별도로 CodeNamespace를 만들어 네임 스페이스를 가져올 수 있습니다. Imports 속성을 사용하면 원하는 네임 스페이스를 추가 할 수 있습니다. CodeCompile 단위에 CodeNamespace를 추가하면 가져 오기가 CodeDOM에 의해 생성 된 파일의 맨 위에 나타납니다. 다음 CodeDOM을 그래프를 컴파일하기 위해에서는 CSharpCodeProvider를 사용하여 예를 들어CodeSnippetCompileUnit에서 네임 스페이스 가져 오기

는 :

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의 값으로 사용할 수 있습니다. 에서 생성 된 파일에 네임 스페이스에서이 유형을 둘러싸 수있는 방법

public class TestClass {} 

, 또는 수입 네임 스페이스 :

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

는 단지 포함 파일을 생성하십시오 CodeSnippetCompileUnit에 위와 동일한 코드를 사용하여 CodeSnippetCompileUnit?

답변

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

} 
+0

, 그래서 실제 줄 바꿈이있을 거라고 생각 '{2}'보다 낫습니다. – svick

+0

당신은 절대적으로 맞습니다. 이 경우 코드 샘플의 가독성이 향상됩니다. 귀하의 제안에 따라 업데이트되었습니다. – bozalina

관련 문제