1

以下のコードを考えると:

void LookupBox_Load(object sender, EventArgs e)
{
    Action d = delegate
        {
            if (!_p.AutoClose)
                CloseLookupBox();
        };

    if (this.ParentForm.MdiParent != null)
        this.ParentForm.MdiParent.Deactivate += delegate { d(); };
    else
        this.ParentForm.Deactivate += delegate { d(); };
}

デリゲート { d(); を省略する方法はありますか? } ?

void LookupBox_Load(object sender, EventArgs e)
{
    Action<object,EventArgs> d = delegate
        {
            if (!_p.AutoClose)
                CloseLookupBox();
        };

    if (this.ParentForm.MdiParent != null)
        this.ParentForm.MdiParent.Deactivate += d;
    else
        this.ParentForm.Deactivate += d;
}

注:これをインラインで行いたい

4

3 に答える 3

4

絶対に - のタイプを変更しdて開始します。

EventHandler d = delegate
    {
        if (!_p.AutoClose)
            CloseLookupBox();
    };

匿名メソッドは、Func と Action だけで機能するわけではありません...

ただし、今後の参考のために、互換性のある署名を持つ既存のデリゲートに基づいて新しいデリゲートを作成できます。

Action<object, EventArgs> d = ...;
EventHandler handler = new EventHandler(d);

しかし、この場合、この余分な間接化は無意味です:)

null 合体演算子を使用して、それを呼び出すコードを少し単純にすることもできます。

Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += d;

その後、一度しか使用しないdため、インライン化して、メソッド全体を次のように変えることができます。

Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += delegate
{
    if (!_p.AutoClose)
        CloseLookupBox();
};
于 2009-10-16T06:33:51.353 に答える
2

それほど良くはありませんが、C# 3.0 を使用している場合は実行できます。

if (this.ParentForm.MdiParent != null)
    this.ParentForm.MdiParent.Deactivate += (x,y) => d();
else
    this.ParentForm.Deactivate += (x,y) => d();
于 2009-10-16T06:26:59.407 に答える
0

Action デリゲートの代わりにEventHandler<MyEventArgs>を使用してそれらを定義する必要があります

  EventHandler<EventArgs> d = delegate        
       {            
            if (!_p.AutoClose)                
               CloseLookupBox();        
       };    
于 2009-10-16T06:30:38.130 に答える