2009-06-02 12 views
25

delegesi alınıyor ben bir sınıfın yöntemlerini teftiş ve belirli imzaya olanlar dahil tarafından doldurulur listede bir açılır menü var. Sorun, seçilen öğeyi listeden almak ve bu yöntemi sınıfta çağırmak için temsilci almaktır. İlk yöntem işe yarıyor, ancak ikincisinin bir kısmını anlayamıyorum. Örneğin 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; 
} 

nasıl ikinci yöntemin dışına yorumladı bölüm işe alabilirim? Nasıl temsilci içine MethodInfo dökme do?

Teşekkürler!

Düzenleme: İşte çalışma çözümdür.

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; 
} 

cevap

21

Söz konusu yöntem, bir statik veya örnek yöntemi olmasına bağlı olarak, Delegate.CreateDelegate() çeşit çağrı gerekir.

+1

Nkohari'ye teşekkürler, tam ihtiyacım olduğu gibi çalıştım. –

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

Bu kabul cevap olmalıdır; doğrudan – Graviton

+1

@Graviton bir 'Delegate' türü olarak veya olmasın yöntem imzası var ne olsun bağlıdır soruyu çözer. Bu durumda, OP o 'vaka Nate ve OP dahil çözüm en iyisi olduğu MyDelegate', önceden varsayabiliriz belirtmek görünüyor. Öte yandan, bu diğer * soru için mükemmel bir cevaptır. Bu, uygun bir "Temsilci" türüne erişiminiz yoksa yapmanız gereken şeydir (yani, tipik olarak, bir "MethodInfo" elde edemezsiniz).) tek başına adıyla mavi ... ama bir temsilci (biraz namlı '.NET' tavuk ve yumurta sorun) yaratmak amacıyla tam böyle bir temsilci türü gerekir. –

İlgili konular