如何检索具有完全限定名称的嵌套类型

本文关键字:定名称 嵌套类型 何检索 检索 | 更新日期: 2023-09-27 18:09:08

我似乎无法使用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()方法应该适用于任何类型,嵌套或其他。

如何检索具有完全限定名称的嵌套类型

尝试使用+来分离内部类:

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

Type.GetType方法的文档讨论了命名嵌套类型所用的语法。