Как я могу получить обработчик метода по его имени?(C #) - PullRequest
2 голосов
/ 25 февраля 2011

Пожалуйста, посмотрите на код ниже, чтобы понять мою проблему:

public class MyClass
{
  public delegate object MyDelegate(object value); 

  public MyDelegate GetMethodByName(string methodName)
  {
     // What have to be here?
  }

  public object Method1(object value)
  {
     // some code here
  }

  public object Method2(object value)
  {
     // some code here
  }

  public object Method3(object value)
  {
     // some code here
  }
}

И где-то:

var obj = new MyClass();
MyDelegate del = obj.GetMethodByName("Method1");
var result = del(someobject);

Так как я могу получить обработчик метода по его имени?(c #)

Ответы [ 6 ]

6 голосов
/ 25 февраля 2011
var obj = new MyClass();
MyDelegate del = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), obj.GetType().GetMethod("Method1"));
var result = del(someobject);
2 голосов
/ 25 февраля 2011
public class MyClass
{
    public delegate object MyDelegate(object value);

    public MyDelegate GetMethodByName(string methodName)
    {
        return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), this.GetType().GetMethod(methodName));
    }

    public object Method1(object value)
    {
        throw new NotImplementedException();
    }

    public object Method2(object value)
    {
        throw new NotImplementedException();
    }

    public object Method3(object value)
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 25 февраля 2011
 public class MyClass
{
    public delegate object MyDelegate(object value);

    MyDelegate del1, del2, del3;

    public MyClass()
    {
        del1 = Method1;
        del2 = Method2;
        del3 = Method3;
        // remaining Ctr code here

    }

    public MyDelegate GetMethodByName(string methodName)
    {
        if (methodName.Equals("Method1"))
            return del1;

        if (methodName.Equals("Method2"))
            return del2;

        if (methodName.Equals("Method3"))
            return del3;

        return null;

    }

    public object Method1(object value)
    {
        // some code here
        return null;
    }

    public object Method2(object value)
    {
        // some code here
        return null;
    }

    public object Method3(object value)
    {
        // some code here
        return null;
    }
}

Если ваш список методов, из которых вы хотите искать, ограничен статически определенными методами, и у вас нет перегруженных методов, то это решение работает без дополнительных затрат на использование отражения. Однако, если вы хотите, чтобы решение было универсальным или работало с перегруженными методами, вы бы пошли тем же путем, что и другие посты, используя отражение.

1 голос
/ 25 февраля 2011

Похоже, вам нужно динамически создать делегат для метода, который получается с помощью отражения. Для этого вы можете использовать метод CreateDelegate следующим образом.

public MyDelegate GetMethodByName(string methodName)
{
    MethodInfo method = GetType().GetMethod(methodName);  // use BindingFlags if method is static/non-public.
    return (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), method);
}

Конечно, вам нужно убедиться, что подпись MyDelegate совпадает с подписью данного метода.

1 голос
/ 25 февраля 2011

Я думаю, что здесь вы пытаетесь добиться динамического вызова метода из C #. Есть много способов сделать это, если честно. Большинство людей используют рефлексию для такого рода вещей, но я бы немного переработал код. Вот ссылка, которая может помочь

http://www.csharphelp.com/2006/05/dynamic-method-invocation-in-c-using-reflection/

0 голосов
/ 25 февраля 2011

Используя отражение, вы можете получить ссылку на экземпляр MethodInfo следующим образом.

    MethodInfo[] methodInfos = typeof(MyClass).GetMethods(BindingFlags.Public |
                                              BindingFlags.Static);
    MethodInfo method1 = methodInfos.SingleOrDefault(m => m.Name == "method1");
...