2015-03-13 2 views
2

Я использую Roslyn для реализации пользовательских бизнес-правил. На данный момент я немного застрял, мне нужно проверить тип параметра при вызове метода. Нет никаких проблем, подтверждающих, что метод вызывается или содержит параметры. У меня есть решение IdentifierNameSyntax с помощью GetSymbolInfo, чтобы получить символ моего текущего синтаксиса. Это не пустое и имеет информацию я ищу таких как:Разрешение типа параметра в Roslyn

CandidateReason: None 
CandidateSymbols: Length = 0 
Symbol: Local System.Threading.Tasks.TaskScheduler ui 

Когда я вхожу в собственность Symbol, я хочу, чтобы проверить, что переменная щ действительно TaskScheduler, но он был неудачная операция в течение нескольких дней .. в принципе, вот информацию я получаю, когда я нахожусь в Symbol

Local System.Threading.Tasks.TaskScheduler ui 
    CanBeReferencedByName: true 
    ConstantValue: null 
    ContainingAssembly: Assembly TestProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 
    ContainingNamespace: Namespace ConsoleApplication1 
    ContainingSymbol: Method void ConsoleApplication1.TypeName.Test() 
    ContainingType: NamedType ConsoleApplication1.TypeName 
    DeclaredAccessibility: NotApplicable 
    DeclaringSyntaxReferences: Length = 1 
    HasConstantValue: false 
    HasUnsupportedMetadata: false 
    HighestPriorityUseSiteError: 2147483647 
    IsAbstract: false 
    IsCatch: false 
    IsConst: false 
    IsDefinition: true 
    IsExtern: false 
    IsFixed: false 
    IsFor: false 
    IsForEach: false 
    IsImplicitlyDeclared: false 
    IsOverride: false 
    IsSealed: false 
    IsStatic: false 
    IsUsing: false 
    IsVar: true 
    IsVirtual: false 
    Kind: Local 
    Language: "C#" 
    Locations: Length = 1 
    MetadataName: "ui" 
    Name: "ui" 
    OriginalDefinition: Local System.Threading.Tasks.TaskScheduler ui 
    OriginalSymbolDefinition: Local System.Threading.Tasks.TaskScheduler ui 
    Type: NamedType System.Threading.Tasks.TaskScheduler 
    binder: {Microsoft.CodeAnalysis.CSharp.BlockBinder} 

Вот то, что я до сих пор, чтобы получить тип Ui:

  • ToString() on OriginalDefinition
  • ToDisplayString() на OrigninalDefinition
  • ToString() на Symbol
  • Пытался достигнуть типа, но я могу видеть его только во время выполнения ....

В случае необходимости, я могу при условии образца но я не могу поделиться кодом, который я сделал. Для тех, кто может задаться вопросом, консольное приложение моделируется во время TDD, у нас есть собственный инструмент для создания модульного теста. Но это не влияет на эту конкретную ситуацию. Спасибо за помощь, я очень ценю это!

ответ

3

Вам необходимо направить ISymbol на номер ILocalSymbol, который является общедоступным.
Затем вы можете использовать Type.

+0

В принципе, ОП закончится чем-то вроде этого? ((ITypeSymbol) Symbol) .Type.ToDisplayString(), чтобы найти его значение @SLaks –

+0

@KevinAvignon: Да, за исключением того, что вам не хватает скобок. Кроме того, вы можете использовать другие свойства результирующего 'ITypeSymbol'. – SLaks

+0

Кроме того, oops; это должно быть приведение к «ILocalSymbol». Исправлена. – SLaks

Смежные вопросы