Есть некоторые незначительные предостережения ... вы должны убедиться, что переменная, которую вы используете для передачи обработчику, не изменяется в пределах области видимости. Это связано с тем, что C # поддерживает лексическое замыкание и использует переменные по ссылке (уверен, Джон Скит мог бы объяснить это лучше). Просто скопируйте переменные, которые вы используете, или вы получите странное поведение.
for (int i = 0; i < observed.Length; ++i)
{
int idx = i;
observed[idx].WhateverEvent += delegate(object sender, EventArgs e)
{
MyHandler(sender, e, idx);
};
}