2009-06-02 13 views
25

से एक प्रतिनिधि प्राप्त करना मेरे पास एक ड्रॉप डाउन सूची है जो कक्षा के तरीकों का निरीक्षण करके और विशिष्ट हस्ताक्षर से मेल खाने वाले लोगों सहित आबादी में आती है। समस्या सूची से चयनित आइटम को लेने और कक्षा में उस विधि को कॉल करने के लिए प्रतिनिधि को प्राप्त करने में है। पहली विधि काम करती है, लेकिन मैं दूसरे भाग का हिस्सा नहीं समझ सकता।methodinfo

उदाहरण के लिए,

public delegate void MyDelegate(MyState state); 

public static MyDelegate GetMyDelegateFromString(string methodName) 
{ 
    switch (methodName) 
    { 
     case "CallMethodOne": 
      return MyFunctionsClass.CallMethodOne; 
     case "CallMethodTwo": 
      return MyFunctionsClass.CallMethodTwo; 
     default: 
      return MyFunctionsClass.CallMethodOne; 
    } 
} 

public static MyDelegate GetMyDelegateFromStringReflection(string methodName) 
{ 
    MyDelegate function = MyFunctionsClass.CallMethodOne; 

    Type inf = typeof(MyFunctionsClass); 
    foreach (var method in inf.GetMethods()) 
    { 
     if (method.Name == methodName) 
     { 
      //function = method; 
      //how do I get the function to call? 
     } 
    } 

    return function; 
} 

मैं कैसे दूसरी विधि की धारा बाहर टिप्पणी की काम करने के लिए मिलता है? मैं प्रतिनिधियों में MethodInfo कैसे लगा सकता हूं?

धन्यवाद!

संपादित करें: यहां कार्य समाधान है।

public static MyDelegate GetMyDelegateFromStringReflection(string methodName) 
{ 
    MyDelegate function = MyFunctionsClass.CallMethodOne; 

    Type inf = typeof(MyFunctionsClass); 
    foreach (var method in inf.GetMethods()) 
    { 
     if (method.Name == methodName) 
     { 
      function = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), method); 
     } 
    } 

    return function; 
} 

उत्तर

21

आप Delegate.CreateDelegate() के कुछ फार्म कॉल करने के लिए, पर कि क्या सवाल में विधि एक स्थिर या उदाहरण विधि है निर्भर करता है की आवश्यकता होगी।

+1

धन्यवाद nkohari, ठीक उसी तरह काम किया जैसा मुझे चाहिए। –

8
private static Delegate CreateDelegate(this MethodInfo methodInfo, object target) { 
    Func<Type[], Type> getType; 
    var isAction = methodInfo.ReturnType.Equals((typeof(void))); 
    var types = methodInfo.GetParameters().Select(p => p.ParameterType); 

    if (isAction) { 
     getType = Expression.GetActionType; 
    } 
    else { 
     getType = Expression.GetFuncType; 
     types = types.Concat(new[] { methodInfo.ReturnType }); 
    } 

    if (methodInfo.IsStatic) { 
     return Delegate.CreateDelegate(getType(types.ToArray()), methodInfo); 
    } 

    return Delegate.CreateDelegate(getType(types.ToArray()), target, methodInfo.Name); 
} 
+0

यह स्वीकार्य उत्तर होना चाहिए: यह सीधे प्रश्न हल करता है – Graviton

+1

@ ग्रेविटन इस बात पर निर्भर करता है कि क्या आपके पास 'प्रतिनिधि' प्रकार के रूप में विधि हस्ताक्षर है या नहीं। इस मामले में, ओपी इंगित करता है कि वह 'माईडेलेगेट' को पूर्व-मान सकता है, इस मामले में नाटक और समाधान ओपी शामिल सर्वोत्तम है। दूसरी ओर, यह * अन्य * प्रश्न के लिए एक उत्कृष्ट उत्तर है, जो कि यदि आपके पास उचित 'प्रतिनिधि' प्रकार तक पहुंच नहीं है (यानी आम तौर पर, आपने 'MethodInfo' आउट-ऑफ- अकेले नाम से नीला) ... लेकिन प्रतिनिधि को बनाने के लिए इस तरह के एक प्रतिनिधि प्रकार की आवश्यकता है (कुछ हद तक कुख्यात '.NET' चिकन और अंडे की समस्या)। –

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