0

众所周知,c# 是强类型语言。

这有利有弊。

我有这段代码可以正常工作,没有问题:

   public static void SetText(Button Obj, string Text) { Obj.Text = Text; }
   public static void SetText(CheckBox Obj, string Text) { Obj.Text = Text; }
   public static void SetText(ComboBox Obj, string Text) { Obj.Text = Text; }
   public static void SetText(Label Obj, string Text) { Obj.Text = Text; }
   public static void SetText(LinkLabel Obj, string Text) { Obj.Text = Text; }
   public static void SetText(RadioButton Obj, string Text) { Obj.Text = Text; }
   public static void SetText(TextBox Obj, string Text) { Obj.Text = Text; }

   public static String GetText(Button Obj) { return Obj.Text; }
   public static String GetText(CheckBox Obj) { return Obj.Text; }
   public static String GetText(ComboBox Obj) { return Obj.Text; }
   public static String GetText(Label Obj) { return Obj.Text; }
   public static String GetText(LinkLabel Obj) { return Obj.Text; }
   public static String GetText(RadioButton Obj) { return Obj.Text; }
   public static String GetText(TextBox Obj) { return Obj.Text; }

减少此代码的简单方法是这样的:

public static void SetText(Object Obj, string Text) { Obj.Text = Text; }
public static String GetText(Object Obj) { return Obj.Text; }

但这是行不通的,因为 c# 是一种关于类型的严格语言。

为了解决这个问题,我可以使用反射,但我不想这样做。

如果有替代方案,我可以减少很多代码,否则我必须为其他功能做这件事。

一些想法?

4

2 回答 2

11

代码中的每个元素都派生自Windows.Forms.Control具有Text属性的元素。

public static void SetText(Control ctrl, string text) { ctrl.Text = text; }
public static String GetText(Control ctrl)            { return ctrl.Text; }

(请注意,标准 .NET 命名约定建议对参数使用小写名称。)

于 2013-03-29T08:16:00.910 回答
0

德米特里的回答很棒,我只是稍微扩展了一点。

假设您在每个方法中都有重要的逻辑(因为为什么需要它们,如果您可以直接访问类Text上的属性Control),您可以利用 C# 中的扩展方法。他们从C# 3.0版本开始添加

public static class ControlExtensions
{
     public static void SetText(this Control ctrl, string text) 
     { 
          ctrl.Text = text;
     }

     public static String GetText(this Control ctrl)            
     { 
          return ctrl.Text;
     }
}

对于简单的静态方法,您调用的方法如下所示:

YourStaticClass.SetText(myControl, "some text");

Control但是使用扩展方法语法,您可以在任何从类派生的对象上编写下一个代码。

myControl.SetText("some text");

SetText并且将调用静态方法

于 2013-03-29T09:00:01.773 回答