Именование аргуметов Action
public event Action<string, int, int> Changed;
Если у Action два и более аргументов одного типа, в большинстве случаев это не понятное уродство. Остаётся либо писать
<summary> T2: old value, T3: new value </summary>,
либо заворачивать в struct.
При генерации метода под это событие выходит:
private void OnChange (string arg1, int arg2, int arg3)
{
throw new NotImplementedException();
}
А случаем нет каких нибудь опций указать имена аргументам Action?
Ответы (2 шт):
Action - это просто делегат, имеющий кучу обобщенных перегрузок. Есть и другой делегат - EventHandler.
public delegate void Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void EventHandler<TEventArgs>(object? sender, TEventArgs e);
Для обработчиков событий принято использовать именно второй. Но это конечно не обязательно означает, что это нужно делать. Например, если вам ну совсем не нужен sender, то можно использовать.
public delegate void Action<in T>(T obj);
Использовать ли при этом EventArgs как базовый класс для передачи данных или нет - тоже дело индивидуальное.
Что такое EventArgs - а вот что.
public class EventArgs
{
public static readonly EventArgs Empty = new EventArgs();
public EventArgs()
{
}
}
Есть ли смысл от него наслодоваться именно в Unity - я думаю нет. От него наследуются в обычных десктопных приложениях, чтобы посредством культуры разработки дать другим разработчикам возможность легче читать код.
Получается, что классного, крутого решения вашей проблемы нет, придется заворачивать аргументы либо в struct, либо в Tuple, либо в class, либо в record (но я не знаю, доступны ли записи в Unity для использования).
Отсюда варианты
Action<(string arg1, int arg2, int arg3)>
Кортежи удобны тем, что их на лету можно собирать, разбирать и пересобирать. И хранить собранный кортеж в одной переменной. Здесь рекомендую смотреть подробнее с практической точки зрения, как вам удобнее.
Либо так.
Action<MyArgsType>
Где MyArgsType например
public struct MyArgsType
{
public string arg1;
public int arg2;
public int arg3;
}
К сожалению, другие варианты решить этот ребус мне неизвестны.
Например, можно отказаться от предопределённого Action<>, воспользоваться кастомным делегатом:
public delegate void ChangedEvent(string name, int oldValue, int newValue);
public class C
{
public event ChangedEvent Changed;
}
При создании обработчика Студия предложит нужные имена:
