Прежде всего, создание событий с не пустыми делегатами является антипаттерном.События, как правило, используются с потенциально большим количеством подписчиков.
Если многократный многоадресный делегат вызывается с несколькими подписчиками, всегда возвращается возвращаемое значение последнего подписанного метода.
Но после всех васможет сделать что-то вроде этого:
string[] objectNames = MyEvent.GetInvocationList().Cast<MyDelegate>().Select(del => del()).ToArray();
Однако лучшим решением будет использование более обычных событий:
public class PopulateNamesEventArgs : EventArgs
{
private List<string> names = new List<string>();
public string[] Names => names.ToArray();
public void AddName(string name) => names.Add(name);
}
А затем в вашем классе:
public event EventHandler<PopulateNamesEventArgs> MyEvent;
protected virtual void OnMyEvent(PopulateNamesEventArgs e) => MyEvent?.Invoke(this, e);
Вызов:
var e = new PopulateNamesEventArgs();
OnMyEvent(e);
string[] objectNames = e.Names; // the result is now populated by the subscribers
Подписка:
void Start()
{
delegatesystem.MyEvent += DelegateFunction;
}
void DelegateFunction(object sender, PopulateNamesEventArgs e)
{
e.AddName(gameObject.name);
}