Skip to content
Радорама
Menu
  • SkillForce2
  • Другие игры
  • Unity
  • Блог
  • Творчество
  • Контакты
  • Поддержать
Menu

Вызов метода через делегат

Posted on 23.03.202123.03.2021 by radoar

Кому-то данная тема покажется минимум странной, но тем не менее, нужно знать, что такая возможность есть.

Допустим, у нас есть Предметы — все разные, и каждый из них используется по-своему. Как реализовать логику для каждого предмета (допустим по его id)?

Можно так:

static public void WhatDoTo(int id)
{
    switch (id)
    {
        case 1:
            Do_1();
            break;
        case 2:
            Do_2();
            break;
            //... и т.д.
         default:
            Debug.Log("Сделай метод для предмета " + id);
            break;
    }
}

Затем создать методы Do_1, Do_2 и т.д.  Этот switch пугает.

Я покажу, как сделать элегантно через делегат.

Создадим класс для обработки логики Предметов, назовём его, например, Item и добавим делегат MyMethod:

public class Item
{
    private delegate void MyMethod();
}

Теперь добавим статический метод, который будет «разруливать» Предметы вместо длинного switch.

static public void WhatDoTo(int id)
{
    Type type = Type.GetType("Item");  // тип данного класса Item
    MyMethod method = (MyMethod)Delegate.CreateDelegate(typeof(MyMethod), Activator.CreateInstance(type), "Do_" + id, false, false);
    if (method != null) method();
    else Debug.Log("Сделай метод для предмета " + id);
}

Здесь создаётся делегат для данного класса (если хотим переправлять вызовы в другой класс, то надо указать его вместо Item), который будет вызывать метод с названием «Do_» и идентификатором Предмета.

Если создать метод не получится (не создали), в консоль выводится напоминание.

Полностью класс может выглядеть так:

using System;
using UnityEditor;
using UnityEngine;

public class Item
{
    private delegate void MyMethod();

    static public void WhatDoTo(int id)
    {
        Type type = Type.GetType("Item");
        MyMethod method = (MyMethod)Delegate.CreateDelegate(typeof(MyMethod), Activator.CreateInstance(type), "Do_" + id, false, false);
        if (method != null) method();
        else Debug.Log("Сделай метод для предмета " + id);
    }

    public void Do_1()
    {
        Debug.Log("Использую предмет 1");
    }
}

Вызов этого «свича», может быть таким:

Item.WhatDoTo(1);
Item.WhatDoTo(555);
Item.WhatDoTo(7);

Что выведет на консоль:

Использую предмет 1
Сделай метод для предмета 555
Сделай метод для предмета 7

14

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

SkillForce2

  • Главная
  • >> Поддержка <<
  • Об игре
  • Форум
  • Скриншоты
  • Видео
  • Играть

Войти

Регистрация

©2021 Радорама | Built using WordPress and Responsive Blogily theme by Superb