使用roslyn获取属性参数

时间:2018-03-06 10:54:29

标签: c# .net roslyn

我尝试使用Roslyn获取submitTransaction的命名参数。

MyAttribute

但是var sourceCode = (@" public class MyAttribute : Attribute { public string Test { get; set; } } [MyAttribute(Test = ""Hello"")] public class MyClass { } "); var syntaxTree = CSharpSyntaxTree.ParseText(sourceCode); var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var compilation = CSharpCompilation.Create("MyCompilation", new[] { syntaxTree }, new[] { mscorlib }); var semanticModel = compilation.GetSemanticModel(syntaxTree); var syntaxRoot = syntaxTree.GetRoot(); var classNode = syntaxRoot.DescendantNodes().OfType<ClassDeclarationSyntax>().Skip(1).First(); var classModel = (ITypeSymbol)semanticModel.GetDeclaredSymbol(classNode); var firstAttribute = classModel.GetAttributes().First(); 等于firstAttribute.AttributeClass.Kind,因此ErrorType不包含任何元素。

代码不是anlyzer或者我有更完整的上下文,比如解决方案。

我看不出roslyn缺少任何引用或其他内容。我该怎么做才能完全分析属性?

2 个答案:

答案 0 :(得分:5)

您需要完全限定Attribute类型名称:

var sourceCode = (@"
    public class MyAttribute : System.Attribute // < here
    {
        public string Test { get; set; }
    }

    [MyAttribute(Test = ""Hello"")]
    public class MyClass { }
");

然后它将按预期工作:

var firstNamedArg = firstAttribute.NamedArguments[0];
var key = firstNamedArg.Key; // "Test"
var value = firstNamedArg.Value.Value; // "Hello"

或者,您可以在顶部添加using System;

var sourceCode = (@"
    using System;
    public class MyAttribute : Attribute
    {
        public string Test { get; set; }
    }

    [MyAttribute(Test = ""Hello"")]
    public class MyClass { }
");

答案 1 :(得分:0)

您可以简单地使用语法API来获取atttribute的参数信息,而不是使用Roslyn&#39; {

}

SemanticModel