2013-04-09 6 views
12

में परिवर्तित कर दिया गया है, मैं वर्तमान में समाधान में हर जगह खोजने की कोशिश कर रहा हूं जहां एक विशिष्ट enum स्ट्रिंग में परिवर्तित हो जाता है, चाहे ToString() को स्पष्ट रूप से बुलाया गया हो या नहीं। (ये एक रूपांतरण enum वर्णन का उपयोग कहानियो को बेहतर बनाने के लिए के साथ प्रतिस्थापित किया जा रहा है।)हर जगह ढूँढना एक enum को स्ट्रिंग

उदाहरण: मैं कोड प्राप्त करना चाहते हैं जैसे string str = "Value: " + SomeEnum.someValue;

मैं एक आवरण वर्ग निहित युक्त साथ enum खुद की जगह की कोशिश की है रैपर वर्ग में enum प्रकार और ओवरराइडिंग ToString() को रूपांतरण, लेकिन जब मैं ToString() ओवरराइड के उपयोग की खोज करने का प्रयास करता हूं तो यह मुझे समाधान में स्थानों की एक सूची देता है जहां ToString() को कुछ भी कहा जाता है (और केवल वहीं इसे स्पष्ट रूप से कहा जाता है)। खोज विजुअल स्टूडियो में रीशेर्पर के साथ की गई थी।

क्या इन enum-to-string रूपांतरणों को खोजने का कोई और तरीका है? पूरे समाधान के माध्यम से मैन्युअल रूप से जाना बहुत मजेदार नहीं लगता है।

+7

रोसलिन टीम, मैं इस टैग किया है तो मैं जानता हूँ कि आप इसे देखेंगे। :-) क्या रोज़लिन की वर्तमान रिलीज बिट्स इस प्रकार के रूपांतरण के लिए एएसटी खोजने की अनुमति देगी? –

+6

आपके रैपर वर्ग में यदि आप पहले से ही कर रहे थे, तो बस एक विस्तार ''स्ट्रिंग' में 'अंतर्निहित' रूपांतरण भी बनाते हैं और इसे '[अप्रचलित]' विशेषता के साथ चिह्नित करते हैं, कंपाइलर चेतावनियां/त्रुटियां आपको हर जगह सूचित करती हैं : http://stackoverflow.com/questions/10585594/how-to-get-find-usages-working-with-implicit-operator-methods यह कोई जवाब नहीं है, लेकिन एक चुटकी में आपकी मदद कर सकता है। –

उत्तर

16

रोज़लिन में चाल 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; 
    } 
} 
+1

वहाँ केविन के LINQ का अच्छा उपयोग। :-) –

+0

मैं आमतौर पर लैम्ब्डा सिंटैक्स का पक्ष लेता हूं, लेकिन इस मामले में मैं वास्तव में डिबगिंग के लिए चलो क्लॉज चाहता था। –

संबंधित मुद्दे