инициализация делегата с помощью строки

#c# #.net #delegates

#c# #.net #делегаты

Вопрос:

Есть ли какой-либо способ инициализировать делегат с помощью строки? Т. е. вы не будете знать имя функции, которую необходимо вызвать во время выполнения? Или я предполагаю, что есть лучший способ сделать это?

    delegate void TestDelegate(myClass obj);

   void TestFunction()
   {
        TestDelegate td = new TestDelegate(myFuncName);  // works
        TestDelegate td = new TestDelegate("myFuncName");  // doesn't work
   }
  

Обновить

Это код, который у меня сейчас есть, который не работает

  class Program
{
    static void Main(string[] args)
    {
        Bish b = new Bish();
        b.MMM();

        Console.Read();
    }
}

class Bish
{
    delegate void TestDelegate();
    public void MMM()
    {
        TestDelegate tDel = (TestDelegate)this.GetType().GetMethod("PrintMe").CreateDelegate(typeof(TestDelegate));
        tDel.Invoke();
    }

    void PrintMe()
    {
        Console.WriteLine("blah");
    }
}
  

Ответ №1:

Вы можете создать динамический делегат таким образом

 class Bish
{
    delegate void TestDelegate();
    delegate void TestDelegateWithParams(string parm);

    public void MMM()
    {
        TestDelegate tDel = () => { this.GetType().GetMethod("PrintMe").Invoke(this, null); };
        tDel.Invoke();

        TestDelegateWithParams tDel2 = (param) => { this.GetType().GetMethod("PrintMeWithParams").Invoke(this, new object[] { param }); };
        tDel2.Invoke("Test");
    }

    public void PrintMe()
    {
        Console.WriteLine("blah");
    }

    public void PrintMeWithParams(string param)
    {
        Console.WriteLine(param);
    }
}
  

Комментарии:

1. Я получаю исключение из системы с нулевой ссылкой?

2. @mHelpMe Является ли метод статическим?

3. Функция должна быть общедоступной

4. Или вы должны добавить BindingFlags.NonPublic | BindingFlags.Instance в GetMethod .

5. Попробуйте это, убедитесь, что ваша функция общедоступна и используйте это TestDelegate tDel = () => { this.GetType().GetMethod("PrintMe").Invoke(this, null); }; tDel.Invoke();