动态代码片段c#visual studio
我正在开发一个WinForms项目,每天都有一些重复的任务。 所以我认为创建代码片段会帮助我,但它仅适用于固定代码。
我想根据控件名称和一些条件动态创建代码片段。
我想在设计部分完成后添加代码。 我定义控件名称,如intTextboxAge
。 该代码段应使用下面定义的function为所有文本框添加自动validation。
必须根据控件的名称前缀(int,str,dou,dec)进行不同的控制。 像这样:
public void AutoCode() { int i=0; foreach(On all controls) { if(controls is textbox or combobox) { if(control.text starts with int) { a[i] = Validation.ValidateInt(labelError, control.text, val => acdnt.date = val); } } } }
我想要一个自动生成的代码片段,库将无法帮助我。
我的动机不是只通过上面的例子生成validation代码就是我们如何做到这一点。
我想自动生成我的所有业务逻辑代码,如主要的胜利forms
- validation
- 为变量创建新类
- validation后在类中填写数据
- 自动创建数据库function插入和更新
因为在以上所有任务中只有变量名称更改,其余业务任务保持不变。 我们如何实施
自动创建class- Class将使用表单名称+“Class”创建,变量类型将由前3个char标识,并将命名为与控件名称相同。
自动创建数据库函数insert和update –将名称数据库表名称与表单名称和列名称相同,与控件名称相同,这样它也可以动态创建插入和更新查询。
为什么我不想使用类库,因为在这种情况下它会在运行时执行所有操作,这将在某个地方吃掉我的性能。
有了这个,我们可以节省大量编码世界的时间和精力。
我想在设计部分完成后添加代码。 我定义控件名称,如intTextboxAge。 该代码段应使用下面定义的函数为所有文本框添加自动validation。
最好将CustomControls与自己的validation一起使用,这样您就不需要在设计部分完成后添加代码:
//Integer input CustomControl with validation label (pictured above) public partial class intTextBox : UserControl { public bool IsValid {get;set;} public intTextBox() { InitializeComponent(); this.textBox1.TextChanged += this.intTextBox_TextChanged; } private void intTextBox_TextChanged(object sender, EventArgs e) { int n; IsValid = int.TryParse(this.textBox1.Text, out n); label1.Visible = !IsValid; } }
必须根据控件的名称前缀(int,str,dou,dec)进行不同的控制
虽然您可以使用控件名称前缀,但我建议您通过派生基本控件并简单地测试控件类型来创建自己的UserControl:
//Decimal input UserControl public class decTextBox : TextBox { public string Text { get { return this.Text; } } public bool IsValid() { decimal n; bool isDecimal = decimal.TryParse(this.Text, out n); return isDecimal; } }
….
public Control AutoCode(Control forEgTheForm) { //Tip: You may need to recursively call this function to check children controls are valid foreach(var ctrl in forEgTheForm.Controls) { if(ctrl is TextBoxBase) { if(ctrl is decTextBox) { decTextBox txt = ((decTextBox)ctrl); //If its not a valid value then set a[i]=true/false or in this example return the control... if (!txt.IsValid()) return ctrl; } } } }
我想根据控件名称和一些条件动态创建代码片段。
如果您要创建代码片段,请根据控件类型执行此操作,而不是控制名称前缀,因此您不需要它们是动态的。
…
如果不必编写任何代码片段或validation代码,那将更加优雅。 这是理想的解决方案。 我建议使用正确的控件类型。
文本框适用于字符串,但对于int,dec和dbl,最好使用NumericUpDown控件。 这样,用户将直观地知道他们需要输入数字(并且不能输入字母数字字符)。 设置几个NumericUpDown控件属性(在设计时或运行时)后,您将不需要在validation中进行编码:
我不确定你遇到的性能下降的原因是什么? 虽然我建议您将控件绑定到类库中具有所有业务逻辑的类,以便您可以进行unit testing。 对于前端validation,虽然简单validation输入是正确的,如上所示是要走的路。
您可以尝试基于CodeSmith等脚本的代码生成器(还有免费的东西)。
您可以根据您定义的变量(也基于数据库项)编写脚本,然后生成代码。
生成代码是一种很好的方法,因为节省了时间,但也标准化了代码。
我认为您可以使用System.Reflection
命名空间与System.CodeDom
命名空间结合来实现您想要的。
您可以使用System.Reflection
命名空间和System.Type
类中的类来发现程序集名称,命名空间,属性,方法,基类以及有关类或变量的大量其他元数据。 然后,您将使用从您的起始/源类(例如,您的表单类)中获取的这些元数据,使用CodeDOM生成目标类(您的业务和数据类)的代码。
检查如何使用CodeDOM作为起点创建类的 msdn链接。