Вы не можете использовать свой собственный класс аргумента события для предопределенной сигнатуры обработчика событий. По крайней мере, пользовательский тип аргумента события никогда не будет использоваться никакими вызовами по умолчанию к обработчику (который всегда будет иметь тип EventArgs
в случае кнопки); потенциально вы могли бы вызвать обработчик самостоятельно, передав свой пользовательский тип, однако вам понадобится логика, чтобы привести его обратно из EventArgs
в то, из которого он был приведен.
В качестве возможного решения (в зависимости от вашей ситуации) рассмотрите составной тип для инкапсуляции необходимых вам элементов, как с вашим типом аргумента события, но сохраните требуемый экземпляр как доступную переменную, которую можно использовать из обработчика события или, по крайней мере, с помощью метода (ов), который вызывает четный обработчик.
Например, укажите ваш тип ...
public class MyType
{
public object AccessibleItem { get; set; }
}
А в твоем классе класс ...
private MyType MyTypeInstance = new MyType();
private void Button_Click(object sender, EventArgs e)
{
//here we can set the item, if needs be...
MyTypeInstance.AccessibleItem = new Anything();
//or access the item to use as required...
DoSomeMagicWithMyObject(MyTypeInstance.AccessibleItem);
}
EDIT:
Хорошо, глядя на ваш текущий код, я могу только предложить вам это сейчас (он не добавляет элементы в контейнер управления формами и использует переменный итератор в Linq (который, я думаю, либо осуждается, либо просто не работает) - правильно (?), но эй ...):
private void BuildButtonToObjectDictionary()
{
int counter = 0;
var assembly = Assembly.LoadFile(@"c:\components.dll");
var buttonToObjectDictionary = (
from type in assembly.GetTypes()
where type.IsClass && !type.IsAbstract
select new
{
Button = new Button
{
Name = type.Name,
Text = type.Name,
Size = new Size(95, 25),
Location = new Point(175 + (counter * 100), 10),
UseVisualStyleBackColor = true
},
Item = Activator.CreateInstance(type),
Index = counter++
});
}