查找枚举转换为字符串的任何地方
本文关键字:任何地 字符串 枚举 转换 查找 | 更新日期: 2023-09-27 18:08:03
我目前正试图在解决方案中找到任何地方,其中特定enum被转换为字符串,无论是否显式调用ToString()。(这些被替换为使用枚举描述的转换,以改善混淆。)
示例:我想找到代码,如string str = "Value: " + SomeEnum.someValue;
我已经尝试用包装器类替换枚举本身,该包装器类包含对枚举类型的隐式转换和覆盖包装器类中的ToString(),但是当我尝试搜索ToString()覆盖的使用时,它给了我一个解决方案中的位置列表,其中ToString()在任何地方都被调用(并且仅在显式调用的地方)。这个搜索是用Visual Studio中的ReSharper完成的。
是否有其他方法来查找这些枚举到字符串的转换?手动遍历整个解决方案听起来并不是很有趣。
在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;
}
}