Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改属性的数据类型时,更新使用该属性的所有局部变量方法签名_C#_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# 更改属性的数据类型时,更新使用该属性的所有局部变量方法签名

C# 更改属性的数据类型时,更新使用该属性的所有局部变量方法签名,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我有一个类say Base,它包含一个属性say Id public abstract class Base { public abstract int Id { get; } } 这个抽象类有许多具体的派生类。e、 g public class Concrete: Base { public override int Id { get { return importChangekeyLogId; } } } 在我的代码解决方案中,也有一些地方

我有一个类say Base,它包含一个属性say Id

public abstract class Base
{
    public abstract int Id { get; }
}
这个抽象类有许多具体的派生类。e、 g

public class Concrete: Base
{
    public override int Id
    {
        get { return importChangekeyLogId; }
    }
}
在我的代码解决方案中,也有一些地方将此属性值存储在局部变量中或作为参数传递给方法。检查下面的示例,其中局部变量id存储属性值,而
SampleChild2
方法接受属性id的值int

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

public void SmapleChild2(int id)
{
}
要求:上述属性只是一个示例,我们有许多此类属性,如果手动执行,估计时间为38天。因此,我想使用Roslyn编写一个实用程序,通过它我可以将属性的数据类型更改为long,还可以找到属性的所有引用,并更新局部变量数据类型和方法签名。所以最终的代码应该是

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;
}

这可以很容易地在Visual Studio中完成,或者使用扩展名(如)或任何好的C#IDE(如果您有权访问源代码)使用替换/重命名命令完成。这可以很容易地在Visual Studio中完成,或者使用扩展名(如)或任何好的C#IDE(如果您有权访问源代码)使用替换/重命名命令完成