2
private void buttonCheck(object sender, EventArgs e)
{
   Type x = sender.GetType();
   var y = Activator.CreateInstance(x); //sends me back to the original problem : sender is an object, not a usable object.

   var x = (Button)sender;  // == button, but you never know what sender is until it's already in this function... so 
   dynamic z = sender; //gives you the image of sender i'm looking for, but it's at runtime, so no intellisense/actual compiletime knowledge of what sender is.
}

クラスセンダーが実際にこのメソッドにもたらしていることを事前に知らずに、センダーの使用可能なインスタンスを作成するにはどうすればよいでしょうか?

4

3 に答える 3

6

ほとんどの場合、どのコントロールがイベントを発生させるかを知っているのは、あなた (プログラマー) がコントロールを接続ているためです。たとえば、このイベントをボタン (または複数のボタン) に接続すると、送信者が であることがわかっているButtonので、次のようにキャストできます。

var b = sender as Button;

また

var b = (Button)sender;

どちらも完全なインテリセンスを提供します。

このイベントを複数のコントロール タイプに接続する場合は、考えられる各タイプを確認することをお勧めします。

if(sender is Button)
//  cast to Button
else if (sender is TextBox)
//  cast to TextBox
else is (sender is CobmoBox)
//  cast to ComboBox

面倒に思えるかもしれませんが、イベント ハンドラーで実際に何をしたいかを述べていないため、1 つのイベントで複数の可能な送信者の種類を処理する最もクリーンな方法です。

もう 1 つのオプションは、複数のイベント ハンドラ (タイプごとに 1 つ) を作成し、それらをそれぞれのタイプに接続することです。Buttonaと a の間の多くのコード再利用シナリオは考えられませんTextBox

于 2013-01-01T15:35:17.950 に答える
0

dynamicキーワードはあなたが探しているものだと思います。コンパイル時に、コンパイラはTextbtn にプロパティがあると想定します。

  private void button1_Click(object sender, EventArgs e)
  {
     var btn = (dynamic)sender;

     string text = btn.Text;
  }
于 2013-01-01T15:35:55.780 に答える
0

DataGridView コントロールから既定の選択をクリアする DataBindingComplete のバリエーションを次に示します。複数のタブにまたがる多数の DataGridView コントロールがあり、それらすべてに対してこの 1 つのイベント ハンドラーのみが必要です。これは素晴らしいことです。これは VladL からの応答に基づいているため、すべてのクレジットは VladL に送られる必要があります。

    private void Dynamic_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e)
    {
        var control = (dynamic) sender;
        control.ClearSelection();
    }
于 2015-07-21T19:27:50.150 に答える