Как удалить скобки, когда мы заменяем вызов статического метода вызовом поля

#c# #roslyn

Вопрос:

Я хочу заменить локатор Container.Get<T> службы полем, которое будет введено конструктором.

 var currentTimeZone = Container.Get<IConfigurationFactory>().GetString("Framework.TimeZone");
 

Автор:

 var currentTimeZone = _configurationFactory.GetString("Framework.TimeZone");
 

для этого я использую этот код:

 internal class AddDependencyByConstructor: CSharpSyntaxRewriter
{
    private readonly SemanticModel _semanticModel;
    private readonly INamedTypeSymbol _containerType;

    public AddDependencyByConstructor(Compilation compilation, SemanticModel semanticModel)
    {
        _containerType = compilation.GetTypeByMetadataName("Syfadis.Framework.Ioc.Container");
        _semanticModel = semanticModel;
    }

    public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
    {
        var symbol = (IMethodSymbol)_semanticModel.GetSymbolInfo(node).Symbol;

        if (symbol != null amp;amp; symbol.ReceiverType.Equals(_containerType) amp;amp; symbol.Name == "Get")
        {
            string variableName = GetVariableName(symbol.ReturnType.OriginalDefinition.Name);

            var expression = SyntaxFactory.IdentifierName(variableName);
            var name = SyntaxFactory.IdentifierName("GetString("Framework.TimeZone")");
            var memberAccessExpression = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, expression, name);
            var nodeFixed = SyntaxFactory.InvocationExpression(memberAccessExpression);

            return base.VisitInvocationExpression(nodeFixed);
        }
        else
        {
            return base.VisitInvocationExpression(node);
        }
    }

    public string GetVariableName(string name)
    {
        return $"_{name.ToLower()[1]}{name.Substring(2)}";
    }
}
 

но это мой результат

 var currentTimeZone = _configurationFactory.GetString("Framework.TimeZone")().GetString("Framework.TimeZone");
 

Как убрать скобки () и второй способ .GetString("Framework.TimeZone") ?

Комментарии:

1. Создайте свойство. В зависимости от положения вещей, пусть получатель свойств вернет либо результат Container.Get<IConfigurationFactory>() , либо значение _configurationFactory поля.