2015-08-13 2 views
1

Я пытаюсь выяснить, есть ли способ получить внутренние данные ТИПА параметра метода.Получить внутренние данные ТИПА параметра метода с использованием Roslyn

Say способ имеет определение ниже

public void method1(Type1 param1, Type2 param2) 
{ 
    ... 
    ... 
} 

И Type1 имеет определение ниже

public class Type1 
{ 
    public int prop1 {get; set;} 
    public string prop2 {get; set;} 
    public double prop3 {get; set;} 
} 

Затем, что я ищу, чтобы выйти из моего инструмента образца список свойств класс Type1. То есть, я ожидаю, мой выход будет

prop1 
prop2 
prop3 

я мог бы получить ссылку на параметр, делая param.Type но это типа IdentifierNameSyntax. Я могу получить имя от него (Type1 в этом случае), но не в состоянии копать глубже INTO Type1, чтобы получить свойства.

Есть ли простой способ получить то, что я еще не знаю? Или мне нужно снова выполнить поиск во всем решении, используя имя типа, который у меня есть?

Большое спасибо!

P.S .: я получал мысль использовать Reflection, но все у меня есть строка (Type1), а не фактический тип. Не уверен, могу ли я использовать это или нет.

Update-1:This question, кажется, мягко близко к тому, что я ожидал, но от того, что я понимаю, пользователь хочет только имя типа параметра, а не его внутренние детали.

Обновление-2: Добавление образца кода из моего инструмента ниже. К сожалению, я не могу опубликовать фактический код, но ниже пример в основном то, что я пытаюсь сделать. Обновление-2: добавление образца кода из моего инструмента ниже. К сожалению, я не могу опубликовать фактический код, но ниже пример в основном то, что я пытаюсь сделать.

var methodNode = (MethodDeclarationSyntax)node; 
string paramClassName = string.Empty; 

foreach (var param in methodNode.ParameterList.Parameters) 
{ 
    paramClassName = param.Type.ToFullString(); 
    //GET Class details from the above class name 
    GetInnerDetailsOfClassFromClassName(paramClassName); //any way to do this? 
} 
+0

Возможно, вы хотите посмотреть на * символы *, а не на синтаксис *. Было бы проще помочь вам в этом, если бы вы могли показать нам контекст вашего кода ... –

+0

http://stackoverflow.com/a/23878410/1034136 –

+0

@JonSkeet Обновлен код. Пожалуйста, проверьте. –

ответ

0

Благодаря @ Serj-Tm, @ KevinPilch-Биссон и @JonSkeet. Ваши предложения по использованию Символов работали. Это мой код ниже, который возвращает результат, который я ожидал.

var methodNode = (MethodDeclarationSyntax)node; 
string modelClassName = string.Empty; 

foreach (var param in methodNode.ParameterList.Parameters) 
{ 
    var metaDataName = document.GetSemanticModelAsync().Result.GetDeclaredSymbol(param).ToDisplayString(); 
//'document' is the current 'Microsoft.CodeAnalysis.Document' object 
    var members = document.Project.GetCompilationAsync().Result.GetTypeByMetadataName(metaDataName).GetMembers(); 
    var props = (members.OfType<IPropertySymbol>()); 

    //now 'props' contains the list of properties from my type, 'Type1' 
    foreach (var prop in props) 
    { 
     //some logic to do something on each proerty 
    } 

} 

Надеюсь, это поможет!

1

После того, как вы нашли ParameterSyntax, используйте SemanticModel.GetDeclaredSymbol, чтобы получить IParameterSymbol, а затем посмотреть на его Type получить ITypeSymbol вы заинтересованы.

+0

Да, это именно то, что я сделал. :) спасибо :) и спасибо @ Serj-Tm тоже за его предложение. Я не смотрел на Символы. Будет опубликовать мой код, чтобы он мог помочь другим. –

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