2014-06-18 1 views
4

Roslyn의 Compilation.GetTypeByMetaDataName() 메서드를 사용하여 중첩 클래스를 검색 할 수없는 것 같습니다. 예를 들어정규화 된 이름으로 중첩 형식을 검색하려면 어떻게해야합니까?

:

var tree = CSharpSyntaxTree.ParseText(@" 
using System; 
namespace MyNamespace 
{ 
    public class MyClass 
    { 
     public class MyInnerClass 
     { 
     } 
    } 
} 
"); 

var Mscorlib = new MetadataFileReference(typeof(object).Assembly.Location); 
var compilation = CSharpCompilation.Create("MyCompilation", 
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib }); 

//Correctly retrieves outer type. 
var outerClass = compilation.GetTypeByMetadataName("MyNamespace.MyClass"); 
//Cannot correctly retrieve inner type (returns null) 
var innerClass = compilation.GetTypeByMetadataName("MyNamespace.MyClass.MyInnerClass"); 

그것은 정규화 된 이름을 사용하여 중첩 된 형식을 검색 할 수 있습니까?

내가 포함하는 유형에 INamespaceorTypeSymbol.GetTypeMembers()을 사용하는 모든 유형이 포함되어 있는지 먼저 확인하는 것이 좋겠지 만 그 경로를 따라 가지 않을 것입니다. 나는 GetTypeByMetaDataName() 메서드가 중첩 된 형식이나 다른 형식으로 작동해야한다고 가정합니다.

답변

6

내부 클래스를 구분 +를 사용하여 시도 :

var innerClass = compilation.GetTypeByMetadataName("MyNamespace.MyClass+MyInnerClass"); 

Type.GetType 방법에 대한 설명서 중첩 유형 이름에 사용 된 구문을 설명한다.

+0

이것은 정확하고 효과적입니다. 감사! – JoshVarty