Существуют разные способы решения этой проблемы. Отражение, конечно, не правильный выбор.
Один из подходов - использовать массив кошек
Cat[] cats = new Cat[] { new Cat(), new Cat(), new Cat() };
Вместо работы с именами кошек вы будете работать с номерами кошек
private void delegateHandler(int catNumber, object sender, CustomEventType evt)
{
DoSomethingWith(cats[catNumber]);
}
Еще один способ - передать самого кота как отправителя (это обычный способ работы с обработчиками событий)
private void delegateHandler(object sender, CustomEventType evt)
{
Cat cat = (Cat)sender;
DoSomethingWith(cat);
}
Еще один способ - присвоить каждой кошке имя свойства
public class Cat
{
public string Name { get; set; }
// Other properties and methods
}
затем используйте словарь для хранения кошек
var catsByName = new Dictionary<string, Cat>();
Cat cat = new Cat { Name = "Tiger" };
catsByName.Add(cat.Name, cat);
...
Тогда вы можете получить кошку по имени
cat = catsByName["Tiger"];
Или, если вы не уверены, существует ли кошка
if (catsByName.TryGetValue("Misty", out cat)) {
DoSomethingWith(cat);
} else {
CatNotFound();
}