【问题标题】:Get inner details of the TYPE of a method parameter using Roslyn使用 Roslyn 获取方法参数的 TYPE 的内部详细信息
【发布时间】:2015-08-13 22:05:31
【问题描述】:

我正在尝试找出是否有办法获取方法参数的 TYPE 的内部详细信息。

假设一个方法具有以下定义

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),而不是实际的 TYPE。不知道能不能用这个。

Update-1: This question 似乎有点接近我的预期,但据我了解,用户只想要参数类型的名称,而不是内部细节。

Update-2:从下面的我的工具中添加示例代码。不幸的是,我无法发布实际代码,但下面的示例基本上就是我想要做的。 Update-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?
}

【问题讨论】:

  • 您可能希望查看符号而不是语法。如果您可以向我们展示您的代码的上下文,那么为您提供帮助会更容易......
  • @JonSkeet 更新了代码。请检查。
  • 正确 - 查看 Serj-Tm 链接到的问题。基本上是一样的——你想通过语义模型获取符号信息。
  • @Serj-Tm 您分享的链接基本上是再次进行完整的解决方案搜索。但我想知道是否有另一种方法可以做到这一点,因为当我的程序在上面给定的代码中时,它已经在搜索中间了。因此要避免在搜索中启动另一个搜索:)

标签: c# visual-studio-2015 code-analysis roslyn


【解决方案1】:

找到ParameterSyntax 后,使用SemanticModel.GetDeclaredSymbol 获取IParameterSymbol,然后查看其Type 以获取您感兴趣的ITypeSymbol

【讨论】:

  • 是的,这正是我所做的。 :) 谢谢 :) 也感谢@Serj-Tm 的建议。我没有看过符号。将发布我的代码,以便它可以帮助其他人。
【解决方案2】:

感谢@Serj-Tm、@KevinPilch-Bisson 和 @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
    }

}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多