12

我目前正在尝试在解决方案中找到将特定枚举转换为字符串的任何地方,无论是否显式调用 ToString()。(这些被替换为使用枚举描述的转换以改善混淆。)

示例:我想查找代码,例如string str = "Value: " + SomeEnum.someValue;

我尝试将枚举本身替换为包含对枚举类型的隐式转换并覆盖包装器类中的 ToString() 的包装器类,但是当我尝试搜索 ToString() 覆盖的用途时,它给了我一个位置列表在任何东西上调用 ToString() 的解决方案(并且仅在显式调用的地方)。搜索是使用 Visual Studio 中的 ReSharper 完成的。

还有其他方法可以找到这些枚举到字符串的转换吗?手动完成整个解决方案听起来并不有趣。

4

1 回答 1

16

Roslyn 的诀窍是使用SemanticModel.GetTypeInfo()然后检查ConvertedType以找到这些隐式转换。

一个完整的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
using Roslyn.Services;
using Roslyn.Services.CSharp;
using Roslyn.Compilers.Common;

class Program
{
    static void Main(string[] args)
    {
        var code = @"enum E { V } class { static void Main() { string s = ""Value: "" + E.V; } }";
        var doc = Solution.Create(SolutionId.CreateNewId())
            .AddCSharpProject("foo", "foo")
            .AddMetadataReference(MetadataFileReference.CreateAssemblyReference("mscorlib"))
            .AddDocument("doc.cs", code);
        var stringType = doc.Project.GetCompilation().GetSpecialType(SpecialType.System_String);
        var e = doc.Project.GetCompilation().GlobalNamespace.GetTypeMembers("E").Single();
        var v = e.GetMembers("V").Single();
        var refs = v.FindReferences(doc.Project.Solution);
        var toStrings = from referencedLocation in refs
                        from r in referencedLocation.Locations
                        let node = GetNode(doc, r.Location)
                        let convertedType = doc.GetSemanticModel().GetTypeInfo(GetNode(doc, r.Location)).ConvertedType
                        where convertedType.Equals(stringType)
                        select r.Location;
        foreach (var loc in toStrings)
        {
            Console.WriteLine(loc);
        }
    }

    static CommonSyntaxNode GetNode(IDocument doc, CommonLocation loc)
    {
        return loc.SourceTree.GetRoot().FindToken(loc.SourceSpan.Start).Parent.Parent.Parent;
    }
}
于 2013-04-09T04:28:55.820 回答