У меня есть класс скажем 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;
}