2012-12-07 18 views
5

मुझे फ़ाइल पर मिली सभी एक्सटेंशन विधियों को सूचीबद्ध करने की आवश्यकता है।Roslyn पर विस्तार विधियां कैसे प्राप्त करें?

यह मैं अब तक क्या कर रहा है (लगता है कि यह काम कर रहा):

var methods = nodes.OfType<MethodDeclarationSyntax>();  
var extensionMethods = methods.Where(m => 
     m.Modifiers.Any(t => t.Kind == SyntaxKind.StaticKeyword) 
     && m.ParameterList.Parameters.Any(p => 
      p.Modifiers.Any(pm => pm.Kind == SyntaxKind.ThisKeyword))); 

हालांकि मैं सभी मामलों ऐसा लगता है कि यह काम कर रहा है का परीक्षण नहीं कर सका। लेकिन मैं सोच रहा था कि इस समाधान तक पहुंचने के लिए एक और संक्षिप्त तरीका था या नहीं।

क्या कुछ प्रकार का IsExtension या कुछ SyntaxKind.ExtensionMethod है? मैंने एक नज़र डाली लेकिन कम से कम कुछ भी स्पष्ट नहीं मिला।

मैं नवीनतम रोसलिन सितम्बर/12

उत्तर

4

आप वाक्यात्मक स्तर पर काम कर रहे हैं और इस स्तर पर, वहाँ "विस्तार विधि" के रूप में ऐसी कोई बात नहीं है का उपयोग कर रहा हूँ। आप प्रत्येक विधि के लिए अर्थपूर्ण जानकारी (Symbol कहा जाता है) प्राप्त करने के लिए क्या कर सकते हैं और वहां आप देखेंगे कि यह एक विस्तार विधि है या नहीं। कुछ की तरह:

SyntaxTree tree = … 
var compilation = Compilation.Create("foo").AddSyntaxTrees(tree); 
var model = compilation.GetSemanticModel(tree); 

var methods = … 
var extensionMethods = 
    methods.Where(m => model.GetDeclaredSymbol(m).IsExtensionMethod); 

यह आपके कोड वास्तव में संकलित करने के लिए की जरूरत है और आप भी संकलन करने के लिए किसी भी आवश्यक संदर्भ जोड़ना होगा का मतलब है।

+0

उत्तर के लिए धन्यवाद, यह काम किया। मैं बस सोच रहा था कि क्या मैं संदर्भ जोड़ने से बचने के लिए अपने दृष्टिकोण का उपयोग कर सकता हूं। मैं परियोजना को यथासंभव स्वतंत्र छोड़ना चाहता था। धन्यवाद। – eestein

+0

हाँ, यदि आप संदर्भ जोड़ना नहीं चाहते हैं, तो मुझे लगता है कि आपका दृष्टिकोण उचित है। – svick

+0

ठीक है, धन्यवाद! – eestein

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