C#订阅和取消订阅事件-来自“字符串”

时间:2019-04-03 10:58:43

标签: c#

是否有可能进行此更改,以使awoid的重复代码过多?

如何更改此设置

protected string Write_TextBox1(string Text)
{
    TextBox1.TextChanged -= TextBox1_TextChanged;
    string text = string.Empty();
    TextBox1.Text = text;
    TextBox1.TextChanged += TextBox1_TextChanged;
    return text;
}

protected string Write_TextBox2(string Text)
{
    TextBox2.TextChanged -= TextBox2_TextChanged;
    string text = string.Empty();
    TextBox2.Text = text;
    TextBox2.TextChanged += TextBox2_TextChanged;
    return text;
}

像这样:

protected string Write_TextBox(TextBox tb, string Text)
{
    tb.TextChanged -= tb.ID + "_TextChanged";
    string text = string.Empty();
    tb.Text = text;
    tb.TextChanged += tb.ID + "_TextChanged";
    return text;
}

1 个答案:

答案 0 :(得分:0)

从技术上讲,您可以尝试使用 Reflection ,例如

using System.Reflection;

...

protected string Write_TextBox(TextBox tb, string text) {
  if (null == tb)
    throw new ArgumentNullException(nameof(tb));

  var method = GetType().GetMethod(
    $"{tb.Name}_TextChanged", 
       BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

  if (null == method) {
    tb.Text = text ?? "";

    return text;
  }

  Delegate dlg = Delegate.CreateDelegate(typeof(EventHandler), this, method);

  // tb.TextChanged -= tb.ID + "_TextChanged";
  tb.GetType().GetEvent("TextChanged").RemoveEventHandler(tb, dlg);

  try {
    tb.Text = text ?? "";
  }
  finally {
    // tb.TextChanged += tb.ID + "_TextChanged";
    tb.GetType().GetEvent("TextChanged").AddEventHandler(tb, dlg); 
  }    

  return text;
}

但是,这是一个糟糕的设计易碎代码,它要求事件处理程序必须具有特殊名称)。尝试为所有TextChanged事件创建一个事件处理程序:

  protected string Write_TextBox(TextBox tb, string text) {
    if (null == tb)
      throw new ArgumentNullException(nameof(tb));

    tb.TextChanged -= my_TextChanged;

    try {
      tb.Text = text ?? ""; 
    }
    finally {
      tb.TextChanged += my_TextChanged;
    } 

    return text; 
  }

其中

  public void my_TextChanged(object sender, EventArgs e) {
    // tb - TextBox that changed its Text
    TextBox tb = sender as TextBox;

    ...
  }