C# 获取插值StringExpressionSyntax的值
使用Roslyn,我将在此方法调用中获取以下字符串参数的常量值:C# 获取插值StringExpressionSyntax的值,c#,.net,roslyn,roslyn-code-analysis,C#,.net,Roslyn,Roslyn Code Analysis,使用Roslyn,我将在此方法调用中获取以下字符串参数的常量值: inst.someMethod($"{Constants.SomeValue}"); 我得到了$“{Constants.SomeValue}”参数的InterpolatedStringExpressionSyntax类型的实例 接下来,我需要获取它的值(即的“Some value”字符串),并尝试调用semanticModel.GetConstantValue(expr)但它返回null 如何获取该值?1)SemanticMod
inst.someMethod($"{Constants.SomeValue}");
我得到了$“{Constants.SomeValue}”
参数的InterpolatedStringExpressionSyntax
类型的实例
接下来,我需要获取它的值(即
的“Some value”
字符串),并尝试调用semanticModel.GetConstantValue(expr)代码>但它返回null
如何获取该值?1)SemanticModel.GetConstantValue
仅适用于编译时常量成员,因此不能使用它获取只读字段的值
2) 如果您想获得readonly字段的值,实际上需要分析常见情况下的字段初始值设定项和构造函数,以确定在何处以及如何创建此字段,等等。
但在上面的简单示例中,当您有一个带有初始值设定项的静态类
和静态只读字段
时,您可以使其如下所示:
InterpolatedStringExpressionSyntax interpolatedExpression=//您以前收到过它
//正如您所知,您的成员是InterpolatedStringExpressionSyntax的第一个内容
var symbolInfo=semanticModel.GetSymbolInfo(((interpolatedExpression).Contents[0]作为InterpolationSyntax.Expression);
如果(!(symbolInfo.Symbol为空))
{
//假设只存在一个声明
var fieldDeclaration=symbolInfo.Symbol.DeclaringSyntaxReferences[0].GetSyntax()作为VariableDeclaratorSyntax;
如果(!(字段声明为空))
{
//从'SomeValue=“SomeValue”检索文本`
var text=(fieldDeclaration.Initializer.Value作为LiteralExpressionSyntax)?.Token.text;
}
}
“接下来,我需要得到它的值”-这将是在执行时计算的值。我不指望罗斯林能做到这一点。我希望Roslyn能够为您提供{0}
的格式字符串和常量.SomeValue
的参数表达式,但这不是一回事。
static class Constants
{
public static readonly string SomeValue= "some value";
}