#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
поля.