我尝试使用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缺少任何引用或其他内容。我该怎么做才能完全分析属性?
答案 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