C#学习教程:在任何地方查找枚举都将转换为字符串分享


在任何地方查找枚举都将转换为字符串

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

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

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

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

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

一个完整的例子:

上述就是C#学习教程:在任何地方查找枚举都将转换为字符串分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

 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: "" + EV; } }"; 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; } } 

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960106.html

发表评论

邮箱地址不会被公开。 必填项已用*标注