Получить значение InterpolatedStringExpressionSyntax - PullRequest
0 голосов
/ 25 января 2019

Используя Roslyn, я получаю постоянное значение следующего строкового параметра в этом вызове метода:

inst.someMethod($"{Constants.SomeValue}");
static class Constants
{
    public static readonly string SomeValue= "some value";
}

Я получил экземпляр типа InterpolatedStringExpressionSyntax для $"{Constants.SomeValue}"параметр.

Далее мне нужно получить его значение (которое является строкой "Some value"), и я попытался вызвать semanticModel.GetConstantValue(expr);, но он возвращает ноль

Как я могу получить это значение

1 Ответ

0 голосов
/ 25 января 2019

1) SemanticModel.GetConstantValue работает только для постоянных членов времени компиляции, поэтому вы не можете использовать его для получения значения только для чтения.

2) Если вы хотите получить значение поля только для чтения, вам нужно проанализировать инициализатор поля и конструкторы в общих случаях, чтобы определить, где и как было создано это поле и так далее. Но в вашем простом примере выше, когда у вас есть static class и статический readonly field с инициализатором, вы можете сделать что-то похожее на это:

InterpolatedStringExpressionSyntax interpolatedExpression = // you received it before
// as you know that your member is the first contet of InterpolatedStringExpressionSyntax 
var symbolInfo = semanticModel.GetSymbolInfo(((interpolatedExpression).Contents[0] as InterpolationSyntax).Expression);
if (!(symbolInfo.Symbol is null))
{
    // assume that exists only a one declaration
    var fieldDeclaration = symbolInfo.Symbol.DeclaringSyntaxReferences[0].GetSyntax() as VariableDeclaratorSyntax;
    if (!(fieldDeclaration is null))
    {
        // retrieves text from `SomeValue = "some value"`
        var text = (fieldDeclaration.Initializer.Value as LiteralExpressionSyntax)?.Token.Text;
    }
}
...