क्या कॉल स्टैक से स्पष्ट इंटरफ़ेस कार्यान्वयन पर प्रतिबिंबित करना संभव है? मैं इंटरफेस पर एक विशेषता देखने के लिए इस जानकारी का उपयोग करना चाहता हूं।कॉल स्टैक से सी # स्पष्ट इंटरफ़ेस कार्यान्वयन पर कैसे प्रतिबिंबित करें?
interface IFoo
{
void Test();
}
class Foo : IFoo
{
void IFoo.Test() { Program.Trace(); }
}
class Program
{
static void Main(string[] args)
{
IFoo f = new Foo();
f.Test();
}
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
// method.???
}
}
विशेष रूप से, ट्रेस में(), मैं चाहते हैं method
से typeof(IFoo)
को पाने के लिए सक्षम होने के लिए:
इस कोड को देखते हुए।
घड़ी विंडो में, यदि मैं method.ToString()
पर देखता हूं तो यह मुझे Void InterfaceReflection.IFoo.Test()
(इंटरफेस रिफ्लेक्शन मेरी असेंबली का नाम देता है) देता है।
मैं वहां से typeof(IFoo)
कैसे प्राप्त कर सकता हूं? क्या मुझे असेंबली से नाम-आधारित प्रकार लुकअप का उपयोग करना चाहिए, या में Type IFoo
कहीं छिपा हुआ है?
अद्यतन: Kyte
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
var parts = method.Name.Split('.');
var iname = parts[parts.Length - 2];
var itype = method.DeclaringType.GetInterface(iname);
}
itype
करने के लिए
यहाँ अंतिम समाधान है, धन्यवाद को लागू करने के लिए विधि इंटरफ़ेस प्रकार होगा। यह केवल स्पष्ट इंटरफ़ेस कार्यान्वयन के साथ काम करेगा, लेकिन यह वही है जो मुझे चाहिए। अब मैं वास्तविक इंटरफ़ेस प्रकार से जुड़े गुणों की क्वेरी के लिए itype
का उपयोग कर सकता हूं।
उनकी मदद के लिए सभी को धन्यवाद।
आह! यही वह है, धन्यवाद। मैं केवल गुणों को देख रहा था, और तरीकों को देखने के लिए नहीं सोचा था। मुझे लगता है कि 'GetInterfaces()' मैं उपयोग कर सकता हूं। मैं 'method.Name' का उपयोग करूंगा जो मुझे' InterfaceReflection.IFoo.Test' देता है, मैं "IFoo" निकाल दूंगा, और इसके मिलान प्रकार को खोजने के लिए 'GetInterface() 'का उपयोग करूंगा। यह काम करता है। – scobi
यदि फू ने 1 से अधिक इंटरफ़ेस लागू किए हैं, तो आपको अभी भी यह पता लगाना होगा कि कौन सी विधि संबंधित है ... प्लस क्या होगा यदि इंटरफ़ेस में टेस्ट को परिभाषित नहीं किया गया था, और फ़ू का वास्तविक तरीका था? – CodingWithSpike
@ रैली25rs: आप i.GetMethods() चला सकते हैं और GetFrame (0) के परिणाम के खिलाफ मैच कर सकते हैं। GetMethod() – Kyte