winform窗体上有Button按钮,button的Text属性修改后,在后台cs文件中,自动创建一个方法,方法名称等于text内容。
如:text=abc,则cs文件中,自动添加一个
public void abc()
{
//....code
}

解决方案 »

  1.   

    动态编译生成代码。但是要生成到另外一个dll中。反射调用。
      

  2.   

    CODEDom,这个应该可以,然后使用编译单元,将你的CS文件便已成为dll
      

  3.   

    动态编译生成代码。但是要生成到另外一个dll中。反射调用。
      

  4.   

    找到一个以前写给别人的例子。    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;
            }
      

  5.   

    这个才是我写过的例子,可以在你这里用到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);
            }
        }
    }
      

  6.   

    可能是我没说明白,我的意思是在winform设计时,即创建出方法abc,以供其他人填充代码用,而不用他们在手动创建该方法。