关于C#的新功能Source Generator,如何获取属性默认值?
例如:
class MyClass
{
public int MyValue { get; set; } = 1;
}
如何在编译时定义1
?
编译时不存在该值,但是,您仍然可以在编译期间从源代码中获取语法。
如果使用符号,一旦找到IPropertySymbol
,就需要通过DeclaringSyntaxReferences
然后GetSyntax()
从中获取语法节点。属性符号没有";运行时";抽象的值。
您要查找的语法节点是PropertyDeclarationSyntax
,在那里您可以得到Initializer
及其Value
,即ExpressionSyntax
。
对于字段,您需要VariableDeclaratorSyntax
。
ISymbol
:示例
var equalsSyntax = symbol.DeclaringSyntaxReferences[0].GetSyntax() switch
{
PropertyDeclarationSyntax property => property.Initializer,
VariableDeclaratorSyntax variable => variable.Initializer,
_ => throw new Exception("Unknown declaration syntax")
};
// If the property/field has an initializer
if (equalsSyntax is not null)
{
var valueAsStr = equalsSyntax.Value.ToString();
}