2015-05-29 4 views
8

से MethodInfo मिलता है I IMIDSymbol (Roslyn वाक्यविन्यास पेड़) से विधिप्रदता (प्रतिबिंब) को विश्वसनीय रूप से कैसे प्राप्त कर सकता हूं। मैं IMethodSymbol से टाइप प्राप्त कर सकता हूं, और इस प्रकार के कई तरीके हैं, जिनमें से एक IMethodSymbol उदाहरण से मेल खाता है।रोज़लिन को IMethodSymbol

उदा।

int i = 0; 
i.Equals(5); 

जहां IMethodSymbol को दिखाता है 'बराबर'

नोट 2 पर एक [Int32] तरीकों टाइप करें, एक लेने और [वस्तु], अन्य लेने [Int32] पैरामीटर [बराबर] देखते हैं कि।

मैं स्क्रिप्ट पार्स कर रहा हूं, मेरे पास कोई वर्कस्पेस उदाहरण नहीं है।

कोई विचार? Stevo

उत्तर

1

यह संभव नहीं है मज़बूती से एक IMethodSymbol से एक MethodInfo मिलता है क्योंकि आप विधानसभा लोड कि प्रकार है कि विधि पर है, स्क्रिप्ट है कि पार्स किया जाता के लिए मामला हो सकता है शामिल करने की जरूरत है, लेकिन विश्लेषण कर रहे कोड के लिए मामला हो सकता है।

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

हालांकि, सिस्टम की तरह एक विधानसभा के लिए, यह शायद एक काफी सुरक्षित शर्त है कि आप इसे विश्लेषक कोड से एक्सेस कर सकते हैं।

तो, आपको बस इतना करना होगा कि उस नाम का नाम और प्रकार का नाम प्राप्त करें जिसमें विधि है और इसके लिए TypeInfo उदाहरण प्राप्त करें। फिर GetMethod का उपयोग करें - इसे विधिInfo प्राप्त करने के लिए विधि और तर्क प्रकारों का नाम पास कर दें। कुछ इस तरह:

var invocation = (InvocationExpressionSyntax)context.Node; 
var methodSymbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(invocation).Symbol; 
var declaringTypeName = string.Format(
    "{0}.{1}", 
    methodSymbol.ContainingType.ContainingAssembly.Name, 
    methodSymbol.ContainingType.Name 
); 
var methodName = methodSymbol.Name; 
var methodArgumentTypeNames = methodSymbol.Parameters.Select(
    p => p.Type.ContainingNamespace.Name + "." + p.Type.Name 
); 
var methodInfo = Type.GetType(declaringTypeName).GetMethod(
    methodName, 
    methodArgumentTypeNames.Select(typeName => Type.GetType(typeName)).ToArray() 
); 

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

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