怎么实现这样一个功能? winform窗体上有Button按钮,button的Text属性修改后,在后台cs文件中,自动创建一个方法,方法名称等于text内容。如:text=abc,则cs文件中,自动添加一个public void abc(){//....code} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 动态编译生成代码。但是要生成到另外一个dll中。反射调用。 CODEDom,这个应该可以,然后使用编译单元,将你的CS文件便已成为dll 动态编译生成代码。但是要生成到另外一个dll中。反射调用。 找到一个以前写给别人的例子。 public class Baseclass { private string name; public string Name { get { return name; } } }//动态创建新类类似如下内容 public class Class : Baseclass { private string getvalue(string value) {//XXXXXX return value; } public new string Name { get { return getvalue(base.Name); } } } public static Type CreateLazy() { Type baseType = typeof(Things); AssemblyName lazyAssemblyName = new AssemblyName("DynamicLazyAssembly"); AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(lazyAssemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder dynamicModule = dynamicAssembly.DefineDynamicModule(lazyAssemblyName.Name, lazyAssemblyName.Name + ".dll"); TypeBuilder dynamicType = dynamicModule.DefineType("LazyThings", TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit, baseType); //PropertyBuilder dynamicProperty = dynamicType.DefineProperty("Name", PropertyAttributes.None, typeof(string), null); MethodInfo baseMethod = baseType.GetProperty("Name").GetGetMethod(); List<Type> list = new List<Type>(); foreach (ParameterInfo p in baseMethod.GetParameters()) { list.Add(p.ParameterType); } MethodBuilder dynamicMethod = dynamicType.DefineMethod(baseMethod.Name, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.Virtual, baseMethod.ReturnType, list.ToArray()); ILGenerator il = dynamicMethod.GetILGenerator(); LocalBuilder s = il.DeclareLocal(typeof(string)); Label lab = il.DefineLabel(); il.Emit(OpCodes.Nop); il.Emit(OpCodes.Ldsfld, typeof(string).GetField("Empty", BindingFlags.Public | BindingFlags.Static | BindingFlags.GetField)); il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Br_S, lab); il.MarkLabel(lab); il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ret); dynamicType.DefineMethodOverride(dynamicMethod, baseMethod); Type cType = dynamicType.CreateType(); //dynamicAssembly.Save(lazyAssemblyName.Name + ".dll"); return cType; } 这个才是我写过的例子,可以在你这里用到textbox1.txt换成你要的代码即可。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Text.RegularExpressions;using System.CodeDom.Compiler;using System.Reflection;namespace CodeCompiler{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { const string baseCode1 = @" using System; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Windows.Forms; namespace MyReplace { public class MyReplaceClass {"; const string baseCode2 = @" } }"; string code = string.Format("{0}{1}{2}", baseCode1, textBox1.Text, baseCode2); CompilerParameters vCompilerParameters = new CompilerParameters(); vCompilerParameters.GenerateExecutable = false; vCompilerParameters.GenerateInMemory = true; vCompilerParameters.ReferencedAssemblies.Add("System.dll"); vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp"); CompilerResults vCompilerResults = codeDomProvider.CompileAssemblyFromSource(vCompilerParameters, code); if (vCompilerResults.Errors.Count > 0) { foreach (CompilerError vCompilerError in vCompilerResults.Errors) { MessageBox.Show("错误:" + vCompilerError.ErrorText); } return; } Assembly vAssembly = vCompilerResults.CompiledAssembly; object objTemp = vAssembly.CreateInstance("MyReplace.MyReplaceClass"); Type t = vAssembly.GetType("MyReplace.MyReplaceClass"); MethodInfo vTest = objTemp.GetType().GetMethod(Regex.Match(textBox1.Text, @"[^ (]+(?= *\()").Value); vTest.Invoke(objTemp, null); } }} 可能是我没说明白,我的意思是在winform设计时,即创建出方法abc,以供其他人填充代码用,而不用他们在手动创建该方法。 devexpress gridview 中改变 buttonEdid 样式 datagridview中的checkbox 的bool值 下载网页源码 英语好的来看个单词,谢谢 一个正则表达式问题,可能涉及到分组构造 求救....C#+Oracle 用.NET写一个使用FTP协议的远程文件传输与管理工具,请大家帮忙提供点思路。 要做一网上电子地图怎么规划? C# printPreviewDialog 打印预览只显示一页 在dataGrid添加行,怎么出错呀,菜鸟问题! 解决马上结贴】如何用DataGridView实现这种效果? c# DateTime 只保留时分秒
{
private string name; public string Name
{
get { return name; }
}
}
//动态创建新类类似如下内容
public class Class : Baseclass
{
private string getvalue(string value)
{
//XXXXXX
return value;
} public new string Name
{
get { return getvalue(base.Name); }
}
}
public static Type CreateLazy()
{
Type baseType = typeof(Things);
AssemblyName lazyAssemblyName = new AssemblyName("DynamicLazyAssembly");
AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(lazyAssemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder dynamicModule = dynamicAssembly.DefineDynamicModule(lazyAssemblyName.Name, lazyAssemblyName.Name + ".dll");
TypeBuilder dynamicType = dynamicModule.DefineType("LazyThings", TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit, baseType);
//PropertyBuilder dynamicProperty = dynamicType.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);
MethodInfo baseMethod = baseType.GetProperty("Name").GetGetMethod();
List<Type> list = new List<Type>();
foreach (ParameterInfo p in baseMethod.GetParameters())
{
list.Add(p.ParameterType);
}
MethodBuilder dynamicMethod = dynamicType.DefineMethod(baseMethod.Name, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.Virtual, baseMethod.ReturnType, list.ToArray());
ILGenerator il = dynamicMethod.GetILGenerator();
LocalBuilder s = il.DeclareLocal(typeof(string));
Label lab = il.DefineLabel();
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldsfld, typeof(string).GetField("Empty", BindingFlags.Public | BindingFlags.Static | BindingFlags.GetField));
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Br_S, lab);
il.MarkLabel(lab);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
dynamicType.DefineMethodOverride(dynamicMethod, baseMethod);
Type cType = dynamicType.CreateType();
//dynamicAssembly.Save(lazyAssemblyName.Name + ".dll");
return cType;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.CodeDom.Compiler;
using System.Reflection;namespace CodeCompiler
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
const string baseCode1 = @"
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace MyReplace
{
public class MyReplaceClass
{"; const string baseCode2 = @"
}
}";
string code = string.Format("{0}{1}{2}", baseCode1, textBox1.Text, baseCode2);
CompilerParameters vCompilerParameters = new CompilerParameters();
vCompilerParameters.GenerateExecutable = false;
vCompilerParameters.GenerateInMemory = true;
vCompilerParameters.ReferencedAssemblies.Add("System.dll");
vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerResults vCompilerResults = codeDomProvider.CompileAssemblyFromSource(vCompilerParameters, code);
if (vCompilerResults.Errors.Count > 0)
{
foreach (CompilerError vCompilerError in vCompilerResults.Errors)
{
MessageBox.Show("错误:" + vCompilerError.ErrorText);
}
return;
} Assembly vAssembly = vCompilerResults.CompiledAssembly;
object objTemp = vAssembly.CreateInstance("MyReplace.MyReplaceClass");
Type t = vAssembly.GetType("MyReplace.MyReplaceClass");
MethodInfo vTest = objTemp.GetType().GetMethod(Regex.Match(textBox1.Text, @"[^ (]+(?= *\()").Value);
vTest.Invoke(objTemp, null);
}
}
}