Кому-то данная тема покажется минимум странной, но тем не менее, нужно знать, что такая возможность есть.
Допустим, у нас есть Предметы — все разные, и каждый из них используется по-своему. Как реализовать логику для каждого предмета (допустим по его 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