C# 可拓解法

C# 可拓解法,c#,.net,extension-methods,C#,.net,Extension Methods,我有一些代码来指示我的WinForm上的字段何时发生了更改 如果是,则根据控件的文本是否等于默认值(或初始值),修改和 如果控件是or,我真的不能这样做(没有可见的前景色或背景色),所以我更改了与控件关联的标签 private void TrainDate_Changed(object sender, EventArgs e) { if (sender.Equals(dtTrainDate)) { DateTime trainDate = Global.SqlDate(emp0.Tr

我有一些代码来指示我的WinForm上的字段何时发生了更改

如果是,则根据控件的文本是否等于默认值(或初始值),修改和

如果控件是or,我真的不能这样做(没有可见的前景色或背景色),所以我更改了与控件关联的标签

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.ForeColor = changedLblFont;
      lblTrainDate.BackColor = changedLblBack;
      btnOK.Enabled = true;
    } else {
      lblTrainDate.ForeColor = systemLblFont;
      lblTrainDate.BackColor = systemLblBack;
    }
    AuthenticationReset();
  }
}
我想创建一些可以根据控件是什么以及值是否更改来更改控件的前景色和后景色的控件

这里是一个尝试,但是在代码中使用
this
是无效的,并且扩展方法不会显示在我想要使用它们的任何控件上

public static class ColorChange {

  public static Color ForeColorChange(this Color owned, bool changed) {
    if (this is TextBox) {
      return changed ? Color.Red : SystemColors.WindowText;
    } else {
      return changed ? Color.Red : SystemColors.ControlText;
    }
  }

  public static Color BackColorChange(this Color owned, bool changed) {
    if (this is TextBox) {
      return changed ? Color.Yellow : SystemColors.Window;
    } else {
      return SystemColors.Control;
    }
  }

}
是否有一种方法来接近我正在尝试做的事情,或者这不是扩展方法的用途

我想以这样的方式结束:

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.ForeColorChange(true);
      lblTrainDate.BackColorChange(true);
      btnOK.Enabled = true;
    } else {
      lblTrainDate.ForeColorChange(false);
      lblTrainDate.BackColorChange(false);
    }
    AuthenticationReset();
  }
}
解决方案:

使用下面选中的答案,我编写了以下扩展方法:

public static class ColorChange {
  public static void AlteredText(this Control owned, bool changed) {
    if (owned is TextBox) {
      owned.ForeColor = changed ? Color.Red : SystemColors.WindowText;
      owned.BackColor = changed ? Color.Yellow : SystemColors.Window;
    } else {
      owned.ForeColor = changed ? Color.Red : SystemColors.ControlText;
      owned.BackColor = SystemColors.Control;
    }
  }
}
以下是我将如何使用它:

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.AlteredText(true);
      btnOK.Enabled = true;
    } else {
      lblTrainDate.AlteredText(false);
    }
    AuthenticationReset();
  }
}

我希望其他人也能从中受益~Joe.

您已经为
Color
类定义了扩展方法,而不是
Control
,这就是它获胜的原因;不显示控件。此外,您的方法可能希望检查您需要传入的
owned
控件。

使用您的
owned
而不是
this
。。哦,正如罗兰·肖所说,
控制
而不是
颜色

因此,您的代码最终应该是

public static Color ForeColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    return changed ? Color.Red : SystemColors.WindowText;
  } else {
    return changed ? Color.Red : SystemColors.ControlText;
  }
}

public static Color BackColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    return changed ? Color.Yellow : SystemColors.Window;
  } else {
    return SystemColors.Control;
  }
}

这扩展了控件而不是颜色(需要在静态类中定义):

用法:

TextBox box = ...;
box.ForeColorChange(true);

如果要在文本框上调用扩展方法,必须在名称空间的顶层执行此操作:

public static class Extensions
{
  public static void myExtensionMethod(this Textbox textbox)
  {
    //Do what you want to do
  }
}
然后可以通过您的文本框访问:

Textbox myTextbox = new Textbox();
myTextbox.myExtensionMethod();

如果需要,还可以将参数传递给扩展方法。

这些方法是在静态类中声明的吗?:是。我有一个静态类,它们是在其中定义的。好问题!所以试着像
(TextBox(Control)).ForeColor.ForeColorChange(true)那样调用它们这种技术还不够通用,无法与标签控件一起使用,不过。。。如果我没弄错的话。一般来说,它也和标签一起工作。但标签不继承控件。因此,如果扩展控件类,则标签不知道它。如果您需要一个始终有效的方法,您可以创建一个自定义DateTimePicker/ComboBox,并在其中附加一个标签。然后这些控件有一个标签句柄,扩展方法可以更改它。+1。你知道了什么,我也理解(说了很多)。第二种方法仍然显示
颜色
类型,但我理解您的意思。
public static class Extensions
{
  public static void myExtensionMethod(this Textbox textbox)
  {
    //Do what you want to do
  }
}
Textbox myTextbox = new Textbox();
myTextbox.myExtensionMethod();