对象实例化期间事件侦听器的c#速记绑定?

对象实例化期间事件侦听器的c#速记绑定?,c#,events,instantiation,shorthand,C#,Events,Instantiation,Shorthand,我发现在循环中填充列表时,我经常喜欢创建一个新项目并将其添加到列表中: foreach(var cat in ctx.InventoryCategories) { pnl_catList.Controls.Add(new RadioButton() { Text = cat.CategoryName, Tag = cat, Checked = false, // how could I do this?

我发现在循环中填充列表时,我经常喜欢创建一个新项目并将其添加到列表中:

foreach(var cat in ctx.InventoryCategories)
{
    pnl_catList.Controls.Add(new RadioButton()
    {
        Text = cat.CategoryName,
        Tag = cat,
        Checked = false,

        // how could I do this?
        Click += onClick(),
    })
}
但我现在知道如何添加事件侦听器的唯一方法是漫长的:

foreach(var cat in ctx.InventoryCategories)
{
    var newButton = new RadioButton()
    {
        Text = cat.CategoryName,
        Tag = cat,
        Checked = false,
    })

    newButton.Click += onClick();
    pnl_catList.Controls.Add(newButton);
}

这是一个糟糕的做法,还是有一个好的短方法来约束事件

字段分配和向事件添加成员是两件不同的事情。C#语言允许使用=作为对象初始化操作符,但不允许使用+=或-=,它们在事件类的后台实现为添加和删除函数。这是一种语言选择——我相信这是基于不在构造函数中包含复杂功能以保持初始化阶段干净的愿望

绕过此限制是可能的,但没有比在对象初始化后简单地添加侦听器更容易理解的解决方案,并且需要更少的代码行


简而言之,没有速记。

字段分配和向事件添加成员是两件不同的事情。C#语言允许使用=作为对象初始化操作符,但不允许使用+=或-=,它们在事件类的后台实现为添加和删除函数。这是一种语言选择——我相信这是基于不在构造函数中包含复杂功能以保持初始化阶段干净的愿望

绕过此限制是可能的,但没有比在对象初始化后简单地添加侦听器更容易理解的解决方案,并且需要更少的代码行


简而言之,没有速记。

后者是一种非常好的做法。我找不到一种通过初始值设定项添加事件处理程序的合理方法。后者是非常好的实践。我找不到通过初始值设定项添加事件处理程序的合理方法。