是否有可能进行此更改,以使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;
}
答案 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;
...
}