(C#)
先别急,听我说话,请看完再回复.
举个小例子,看图:
[img=http://img.bbs.csdn.net/upload/201305/17/1368773112_379070.jpg][/img]
如果我需要创建Button,Label,CheckBox中的任意一种控件,我只需要选中他们,这样我写出三个创建控件的方法,调用就OK了.看我的代码:
先将选中的CheckBox的text保存到List<string>中,遍历list判断:
1 public void cbcreself(int i,List<string> list) 2 { 3 for (int j = 0; j < list.Count; j++) 4 { 5 if (list[j].ToString() == "Button") 6 { 7 CreButton(i);//创建Button的方法 8 } 9 if (list[j].ToString()=="Label") 10 { 11 CreLabel(i);//创建Label的方法 12 } 13 if (list[j].ToString()=="CheckBox") 14 { 15 CreCheckBox(i);//创建CheckBox的方法 16 } 17 } 18 }
创建Button的方法如下:
1 /// <summary> 2 /// 创建Button 3 /// </summary> 4 public void CreButton(int count) 5 { 6 Button[] cre = new Button[count]; 7 for (int k = 0; k < cre.Length; k++) 8 { 9 cre[k] = new Button(); 10 cre[k].Top = 10; 11 cre[k].Location = new Point(20, k * 30 + 20); 12 cre[k].Text = "btn" + k.ToString(); 13 this.gbRes.Controls.Add(cre[k]); 14 } 15 }
创建Label,CheckBox雷同.
但是如果控件不仅仅有三个,假设无数个,针对不同种类的控件,不可能再去一一写出来.
我想到了C#中的泛型,类,反射.
先说泛型,可不可以将这里的Button,Label,CheckBox...泛型呢?但是这样就出现一个问题,这里的Button,Label,CheckBox...都是有实际意义的,假设我们泛型了,当給各个控件 属性 赋值就会出现问题.
1 cre[k] = new Button();//泛型了就不能new了,并且下面肯定也是没发赋值的 2 cre[k].Top = 10; 3 cre[k].Location = new Point(20, k * 30 + 20); 4 cre[k].Text = "btn" + k.ToString();
其次说一下类,用类的话,可以新建一个类,在里面写一个方法,但是类就是一个单纯的CS文件,我们怎么給诸如Button,Label,CheckBox.这样的控件赋属性值呢,因为在类中这些控件类型貌似都出不来,即使传递过来,是不是也没法赋属性呢.
最后说一下反射,同样和泛型一样的问题,如何实例化,因为new不出来,反射出来的是一个诸如这些Button,Label,CheckBox..字符串,而不是真正的控件类型,强制转换么,貌似转换也不好使把.
希望大家都能给我点建议和好的想法.
PS:为什么这里的上传图片控件,code控件都被公司屏蔽了,但是在后台发表随笔那里怎么没有被屏蔽.只能这样贴上代码了,被屏蔽也没办法.
泛型约束,你感受一下。
class Program { static void Main(string[] args) { var control = Create<System.Windows.Forms.TextBox>(); Console.ReadKey(); } public static T Create<T>() where T : System.Windows.Forms.Control, new() { var t = new T(); t.Top = 1; t.Location = new System.Drawing.Point(); t.Text = t.GetType().FullName; return t; } }
泛型约束,感觉不就是对泛型经行限制么,但是为什么你会想到要用到这里呢?
看了一下,还是有点懵,
主要懵是因为这一行:
public static T Create<T>()
where T : System.Windows.Forms.Control, new()
@flyher:
上面的代码是否解决了你的问题?
你的需求是创建Button,Label,Check这三个控件,这三个控件都从Control继承,并且都有无参构造函数。
从Control继承是限定基类,无参构造函数用于创建对象。
所以上面代码两个约束的意思是:类型T必须从Control继承;必须有无参构造函数。