繁体   English   中英

如何在Roslyn中获得参数的类型?

[英]How to get the type of an argument in Roslyn?

所以我在调用方法时试图知道参数中某些变量的类型。 如:

class Program
{
    static void Main(string[] args)
    {
        string a = "astring"
        string.Format("zzzz{0}", a);
    }
}

所以我想知道string.Format中变量a的类型(“zzzz {0},a”); 我正在尝试更改一些代码,所以我使用的是重写器,这是我得到的:

public class CustomFormatRewriter : CSharpSyntaxRewriter{

    public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax rootNode){
        if (null != rootNode){
            var arguments =
            from n in secondNode.DescendantNodes()
            where (n.Kind() == SyntaxKind.Argument)
            select n;

            foreach (var argument in arguments)
            {
               var compilation = CSharpCompilation.Create("arg")
                                                            .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
                                                     .AddSyntaxTrees(rootNode.SyntaxTree);

               var model = compilation.GetSemanticModel(rootNode.SyntaxTree);
               var symbolInfo = model.GetSymbolInfo(argument);
               Console.WriteLine(symbolInfo.Symbol);
            }
        }  
        return rootNode;
    }

}

但是我得到的symbolInfo.Symbol是null。

任何想法? 谢谢!!

如果您想知道某事物的类型 ,可以调用SemanticModel.GetTypeInfo 这适用于所有表达式,而不仅仅是直接变量的表达式。 这样不仅会传递表达为a给你的类型的a ,但a.SomeMethod()会找出哪些的someMethod的过载是被称为上a ,并且会给你回报的类型。 如果你的表达式只是一个数字,它会告诉你类型是Int32。

只有当您直接传入的内容是对符号的引用时, GetSymbolInfo才有效,即它是本地或字段的名称或其他内容。 在你的情况下,第一个字符串的参数不会给你一个符号。 它有一个类型(特别是System.String),但它不是一个符号。

好吧,我发现了为什么我总是变空。 发布以防万一有人可能会在将来发现它有用。

我发现这篇文章非常有助于识别我的问题。 所以事实证明我没有在正确的“级别”上检查类型,正如我所说的那样。 我在帖子中使用了这个方法(在语法可视化工具中,右击一个节点 - > view typeSymbol)来检查我的参数的类型。 我发现,如果我检查“Argument”,那么什么都没有,这就解释了为什么我得到了null。 如果我检查“Argument”下级别的节点,它会为您提供正确的类型。

所以我将我的代码更改为:

var typeInfo = model.GetTypeInfo(argument.ChildNodes().First());
Console.WriteLine(typeInfo);

它有效。

将其转换为ILocalSymbol ,然后读取Type属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM