C# 获取插值StringExpressionSyntax的值

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

使用Roslyn,我将在此方法调用中获取以下字符串参数的常量值:

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";
}