2009-10-26 12 views
6

मुझे पता शीर्षक को समझने के लिए एक से अधिक बार पढ़ा जा करने की जरूरत है ... :)मैं सी # में प्रतिबिंब द्वारा प्राप्त विधि को एक विधि के रूप में स्वीकार करने वाली विधि को कैसे पास कर सकता हूं?

मैं एक कस्टम कार्यान्वित विशेषता है कि मैं अपने वर्गों में तरीकों पर लागू होते हैं। सभी तरीकों मैं विशेषता लागू ही हस्ताक्षर करने के लिए और इस तरह मैं उनके लिए एक प्रतिनिधि परिभाषित:

public delegate void TestMethod(); 

मैं एक struct कि एक पैरामीटर

struct TestMetaData 
{ 
    TestMethod method; 
    string testName; 
} 

के रूप में है कि प्रतिनिधि को स्वीकार करता है यह संभव है प्रतिबिंब से प्राप्त एक विधि जिसमें कस्टम विशेषता है और इसे 'विधि' सदस्य में संरचना में पास करता है?

मुझे पता है कि आप इसे आमंत्रित कर सकते हैं लेकिन मुझे लगता है कि प्रतिबिंब मुझे मेरी कक्षा से वास्तविक विधि नहीं देगा जो मैं TestMethod प्रतिनिधि को डाल सकता हूं।

उत्तर

11

एक बार जब आपके पास प्रतिबिंब के माध्यम से MethodInfo है, तो आप इसे Delegate.CreateDelegate का उपयोग किसी प्रतिनिधि में बदलने के लिए कर सकते हैं, और फिर इसे सीधे अपनी संरचना के गुण/क्षेत्र में सेट करने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

+0

धन्यवाद! पूरी तरह से काम किया। – thedrs

1

आप एक प्रतिनिधि बना सकते हैं जो आपके प्रतिबिंबित विधि को Invoke, या Delegate.CreateDelegate का उपयोग कर रनटाइम पर कॉल करता है।

उदाहरण:

using System; 
class Program 
{ 
    public delegate void TestMethod(); 
    public class Test 
    { 
     public void MyMethod() 
     { 
      Console.WriteLine("Test"); 
     } 
    } 
    static void Main(string[] args) 
    { 
     Test t = new Test(); 
     Type test = t.GetType(); 
     var reflectedMethod = test.GetMethod("MyMethod"); 
     TestMethod method = (TestMethod)Delegate.CreateDelegate(typeof(TestMethod), t, reflectedMethod); 
     method(); 
    } 
} 
+0

प्रतिनिधि। क्रेते डेलीगेट आसान होगा ... कोई भी आमंत्रित नहीं है। –

+0

@Marc, आप सही हैं, मैंने CreateDelegate का उपयोग करके नमूना के साथ अपडेट किया है। – driis

0

इसके अलावा, आप उपयुक्त प्रतिनिधि की जरूरत पहले से ही

0

एक उदाहरण के रूप में घोषित किया जा करने के लिए:

using System; 
using System.Linq; 

using System.Reflection; 
public delegate void TestMethod(); 
class FooAttribute : Attribute { } 
static class Program 
{ 
    static void Main() { 
     // find by attribute 
     MethodInfo method = 
      (from m in typeof(Program).GetMethods() 
      where Attribute.IsDefined(m, typeof(FooAttribute)) 
      select m).First(); 

     TestMethod del = (TestMethod)Delegate.CreateDelegate(
      typeof(TestMethod), method); 
     TestMetaData tmd = new TestMetaData(del, method.Name); 
     tmd.Bar(); 
    } 
    [Foo] 
    public static void TestImpl() { 
     Console.WriteLine("hi"); 
    } 
} 

struct TestMetaData 
{ 
    public TestMetaData(TestMethod method, string name) 
    { 
     this.method = method; 
     this.testName = name; 
    } 
    readonly TestMethod method; 
    readonly string testName; 
    public void Bar() { method(); } 
} 
संबंधित मुद्दे

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