Получение нулевого значения для ITypeSymbol

Я пишу несколько тестов, и мне нужно получить ITypeSymbol. Вот как я это делаю:

    private async Task<ITypeSymbol> GetTypeSymbol(string file, TextSpan span)
    {
        var code = File.ReadAllText(file);
        var tree = CSharpSyntaxTree.ParseText(code);

        var compilation = CSharpCompilation.Create(
            this.GetType().Assembly.GetName().Name,
            syntaxTrees: new[] { tree },
            references: new[]
            {
                MetadataReference.CreateFromAssembly(typeof(object).Assembly))
            });

        var model = compilation.GetSemanticModel(tree);
        var root = await tree.GetRootAsync().ConfigureAwait(false);
        return model.GetTypeInfo(root.FindNode(span)).Type;
    }

По какой-то причине свойство Type в последней строке всегда имеет значение null, даже если я передаю код из файла, который выглядит так:

public class AClass { }

Чтобы было ясно, файл читается нормально, он правильно анализируется, компиляция создана, я могу получить модель, и FindNode() найдет правильный узел ClassDeclarationSyntax, который я ищу. GetTypeInfo() возвращает значение, но и Type, и ConvertedType имеют значение null. Я как бы ожидал, что это действительно должно иметь значение. Правильно ли мое ожидание? Если да, то что я делаю неправильно, так что свойство Type имеет значение null?


person JasonBock    schedule 16.05.2015    source источник
comment
Чтобы уточнить, что я действительно хочу сделать, так это выяснить, наследуется ли тип от определенного типа, будь то интерфейс или класс. Если бы я мог использовать отражение, я мог бы сделать .IsAssignableFrom() и закончить, но я не могу. Итак, я собирался использовать BaseType и интерфейсы для ITypeSymbol для рекурсивного спуска, но если я даже не могу получить тип из GetTypeInfo(), моя идея мертва.   -  person JasonBock    schedule 16.05.2015


Ответы (1)


На самом деле это похоже на GetDeclaredSymbol() (Как получить предка модуля в семантическая модель roslyn?) — правильный путь. Это прекрасно работает.

person JasonBock    schedule 16.05.2015
comment
Рослин обычно проводит различие между объявлениями символов и ссылками на символы. GetDeclaredSymbol используется для первого и GetSymbolInfo/GetTypeInfo для второго. - person Kevin Pilch; 16.05.2015