При изменении типа данных свойства обновляют все локальные переменные Сигнатуры методов, которые используют свойство - PullRequest
1 голос
/ 27 января 2020

У меня есть класс скажем Base, который содержит свойство, скажем Id

public abstract class Base
{
    public abstract int Id { get; }
}

Этот абстрактный класс имеет много конкретных производных классов. например;

public class Concrete: Base
{
    public override int Id
    {
        get { return importChangekeyLogId; }
    }
}

Также В моем решении для кода есть места, где это значение свойства сохраняется в локальной переменной или передается в качестве параметра методу. Ниже приведен пример, где локальная переменная id хранит значение свойства, а метод SampleChild2 принимает значение int, которое является значением идентификатора свойства.

public int Sample1(Concrete obj)
{
    int id = obj.Id;
    SmapleChild2(obj.Id);
    return id;
}

public void SmapleChild2(int id)
{
}

Требование : указанное выше свойство является лишь примером Есть много таких видов свойств и расчетное время, если сделано вручную, составляет 38 дней. Поэтому я хочу написать утилиту с использованием Roslyn, с помощью которой я могу изменить тип данных Properties на long, а также найти все ссылки на Properties и обновить типы данных локальных переменных и сигнатуры методов. Таким образом, окончательный код должен выглядеть следующим образом:

public abstract class Base
{
    public abstract long Id { get; }       
}

public class Concrete: Base
{
    public override long Id
    {
        get { return importChangekeyLogId; }
    }
}

public long Sample1(Concrete obj)
{
    long id = obj.Id;
    SmapleChild2(obj.Id);
    return id;
}

public void SmapleChild2(long id)
{
}

Код выполняется до сих пор : я могу изменить тип данных свойства абстрактного класса на long, используя код, подобный приведенному ниже

public override SyntaxNode VisitPropertyDeclaration(PropertyDeclarationSyntax node)
{
    PredefinedTypeSyntax _longType = SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.LongKeyword)).WithTrailingTrivia(SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " "));

    if (node.Type.ToString() == "int")
    {
        var propertyName = node.Identifier.ValueText;
        if (propertyName == "Id")
        {
            return node.ReplaceNode(node.Type, _longType);
        }   
    }

    return node;
}

Я могу найти все ссылки, в которых используется это свойство, из приведенного ниже кода. Но я не могу найти способ обновить тип данных и сигнатуры методов локальной переменной, которые имеют дело со значением свойства.

if (propertyName == "Id")
{
    var propertySymbol = (IPropertySymbol)_semanticModel.GetDeclaredSymbol(node);
    var references = SymbolFinder.FindReferencesAsync(propertySymbol, this._solution).Result;
}
...