Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为一组控件设置公共属性_C#_Reusability - Fatal编程技术网

C# 为一组控件设置公共属性

C# 为一组控件设置公共属性,c#,reusability,C#,Reusability,我在一个函数中,该函数在表单中重新绘制某些控件,它是作为ControlCollection类的扩展方法实现的,如下所示: void SetColorsCorrespondingToVisualStudioTheme(this Control.ControlCollection controls) { foreach (var control in controls) { ... 在该方法中,设置一组控件所共有的一些GUI属性的代码: ... if (controlTyp

我在一个函数中,该函数在表单中重新绘制某些控件,它是作为ControlCollection类的扩展方法实现的,如下所示:

void SetColorsCorrespondingToVisualStudioTheme(this Control.ControlCollection controls)
{
  foreach (var control in controls)
  {
  ...
在该方法中,设置一组控件所共有的一些GUI属性的代码:

  ...
    if (controlType == typeof(TreeView))
    {
      ((TreeView)control).BorderStyle = BorderStyle.None;
      ((TreeView)control).BackColor = EditorBackgroundColor;
      ((TreeView)control).ForeColor = FontColor;
      continue;
    }

    if (controlType == typeof(TextBox))
    {
      ((TextBox)control).BorderStyle = BorderStyle.None;
      ((TextBox)control).BackColor = EditorBackgroundColor;
      ((TextBox)control).ForeColor = FontColor;
    }
 ...
我想知道是否有一种方法可以重构代码以便重用,如:

    if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
    {
      ((controlType)control).BorderStyle = BorderStyle.None;
      ((controlType)control).BackColor = EditorBackgroundColor;
      ((controlType)control).ForeColor = FontColor;
    }
上面的代码显然不起作用,因为controlType是一个变量而不是一个类型,但我试图做的事情的意图才是重要的。我也试过:

((typeof(controlType))control).B...
我现在能想到的唯一选择是为基本类型(TreeView、TextBox等)创建自定义控件,并使它们都实现一个公共接口,以便我可以互换使用它们:

 ...
    if (controlType == typeof(TreeView) || controlType == typeof(TextBox))
    {
      //CustomControl() ñ 
      ICustomControl newControl = new CustomControl(control);      
      newControl.BorderStyle = BorderStyle.None;
      newControl.BackColor = EditorBackgroundColor;
      newControl.ForeColor = FontColor;
    }
...
    public class CustomTreeView : ICustomControl
    {
...
    public class CustomTextBox : ICustomControl
    {
...
    public interface ICustomControl
    {
       public BorderStyle BorderStyle {get; set;}
       public Color BackColor {get; set;}
       public Color ForeColor {get; set;}
...
但这(至少在我脑海中)听起来比保持倍数if更糟糕。
我是否缺少您可能知道的解决此问题的另一种方法?

我可能会创建一个结构以保留属性的所需值,以及一个方法,该方法接受类型为Control的参数并对其应用样式:

if (control is TreeView || control is TextBox)
{
  ((Control)control).BorderStyle = BorderStyle.None;
  ((Control)control).BackColor = EditorBackgroundColor;
  ((Control)control).ForeColor = FontColor;
}
struct ThemeStyle
{
    ThemeStyle(Color backColor, Color foreColor, BorderStyle borderStyle)
    {
        this.BackColor = backColor;
        this.ForeColor = foreColor;
        this.BorderStyle = borderStyle;
    }
    public Color BackColor {get; private set;}
    public Color ForeColor {get; private set;}
    public BorderStyle BorderStyle {get; private set;}

    public void Apply(Control c)
    {
        c.BackColor = this.BackColor;
        switch(typeof(c))
        {
             case typeof(TreeView):
             case typeof(TextBox):
               c.BorderStyle = this.BorderStyle;
             break;
        }
    }
}
注意:此代码只是一个演示,直接使用手机编写。可能有一些错误


然后在循环中,您所需要做的就是使用控件调用Apply方法。

您可以将
控件
强制转换为
动态
,并设置您想要的任何属性,只要这些属性在运行时存在。例:
((动态)控制)。Whatever=某物。这两个类都是从控件类继承的属性。因此,您可以简单地强制转换为(控件)。但我相信BorderStyle不属于控件类。@Saragis确实,BorderStyle不属于控件类,这就是为什么我需要将控件强制转换为更特定的类型。@Ron Beyer您的解决方案正是我所寻找的!谢谢这是对if子句的一个改进,但我还想重用if语句的内容。现在试试吧,我不太习惯这个API,所以我不确定,只是尝试了它们共享的一个基类。另外,我可以看看你是如何声明控件的吗?我已经包括了刚才声明“控件”的代码,它位于ControlCollection的foreach语句中。虽然BorderStyle不是控件类的一部分,但您的解决方案使我朝着正确的方向前进了一步,因为我使用了许多其他控件的BackColor和ForeColor属性。虽然这似乎是一个很好的建议,可以对共享公共属性的控件进行分组和排序,问题仍然是当这些控件中的某些控件不是直接从控件类派生(如BorderStyle)时设置这些属性,我可能会将您的方法与@Ron Beyer提出的建议(使用动态类型)结合起来,以获得一个完整的解决方案。谢谢这个答案的要点是将属性赋值从循环中移到单个方法中。不管怎样,很高兴能帮上忙。。。