不用Stream创建
有没有其他的,比如创建xml有xmlDocument  这样可以有相对的格式,创建.cs文件有没有相关的对象?

解决方案 »

  1.   

    ...  啊,我是要创建.cs  希望像手动创建那样代码规整呢,Stream的话  代码就会比较乱啊
      

  2.   

    System.CodeDom
    内容可能太短
      

  3.   

    ??
    动态创建类
    ???
    和你cs文件有何关系,cs是输出,类是运行期??如果要动态创建,运行期类,参考codedom
    如果要输出cs文件,参考Microsoft.CSharp.CSharpCodeProvider类
      

  4.   

    不大明白楼主的意思难道要用codesmith模板吗,那样创建出来的就和写的一样了
      

  5.   

    LZ是不是要生成一个cs文件阿?但又要像自己在VS里写的那样自动缩进?
      

  6.   

    楼主是想根据类图之类的东西生成.cs文件吧
    CodeDom
      

  7.   

    不知道lz的意思是否是这样
    http://www.dotnetspider.com/resources/565-Generating-C-Class-File-Sample-cs-Dynamically-us.aspx
      

  8.   

    除了用Stream的这种  有没有其他方法呀?
      

  9.   

    using System;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using System.Text;
    using System.Reflection;namespace ADOGuy
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Evaluator
    {
        #region Construction
    public Evaluator(EvaluatorItem[] items)
    {
          ConstructEvaluator(items);
    }    public Evaluator(Type returnType, string expression, string name)
        {
          EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
          ConstructEvaluator(items);
        }    public Evaluator(EvaluatorItem item)
        {
          EvaluatorItem[] items = { item };
          ConstructEvaluator(items);
        }    private void ConstructEvaluator(EvaluatorItem[] items)
        {
          ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
          CompilerParameters cp = new CompilerParameters();
          cp.ReferencedAssemblies.Add("system.dll");
          cp.ReferencedAssemblies.Add("system.data.dll");
          cp.ReferencedAssemblies.Add("system.xml.dll");
          cp.GenerateExecutable = false;
          cp.GenerateInMemory = true;      StringBuilder code = new StringBuilder();
          code.Append("using System; \n");
          code.Append("using System.Data; \n");
          code.Append("using System.Data.SqlClient; \n");
          code.Append("using System.Data.OleDb; \n");
          code.Append("using System.Xml; \n");
          code.Append("namespace ADOGuy { \n");
          code.Append("  public class _Evaluator { \n");
          foreach(EvaluatorItem item in items)
          {
            code.AppendFormat("    public {0} {1}() ", 
                              item.ReturnType.Name, 
                              item.Name);
            code.Append("{ ");
            code.AppendFormat("      return ({0}); ", item.Expression);
            code.Append("}\n");
          }
          code.Append("} }");      CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
          if (cr.Errors.HasErrors)
          {
            StringBuilder error = new StringBuilder();
            error.Append("Error Compiling Expression: ");
            foreach (CompilerError err in cr.Errors)
            {
              error.AppendFormat("{0}\n", err.ErrorText);
            }
            throw new Exception("Error Compiling Expression: " + error.ToString());
          }
          Assembly a = cr.CompiledAssembly;
          _Compiled = a.CreateInstance("ADOGuy._Evaluator");
        }
        #endregion    #region Public Members
        public int EvaluateInt(string name)
        {
          return (int) Evaluate(name);
        }    public string EvaluateString(string name)
        {
          return (string) Evaluate(name);
        }    public bool EvaluateBool(string name)
        {
          return (bool) Evaluate(name);
        }    public object Evaluate(string name)
        {
          MethodInfo mi = _Compiled.GetType().GetMethod(name);
          return mi.Invoke(_Compiled, null);
        }
        #endregion    #region Static Members
        static public int EvaluateToInteger(string code)
        {
          Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
          return (int) eval.Evaluate(staticMethodName);
        }    static public string EvaluateToString(string code)
        {
          Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
          return (string) eval.Evaluate(staticMethodName);
        }
        
        static public bool EvaluateToBool(string code)
        {
          Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
          return (bool) eval.Evaluate(staticMethodName);
        }    static public object EvaluateToObject(string code)
        {
          Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
          return eval.Evaluate(staticMethodName);
        }
        #endregion    #region Private
        const string staticMethodName = "__foo";
        Type _CompiledType = null;
        object _Compiled = null;
        #endregion
    }  public class EvaluatorItem
      {
        public EvaluatorItem(Type returnType, string expression, string name)
        {
          ReturnType = returnType;
          Expression = expression;
          Name = name;
        }    public Type ReturnType;
        public string Name;
        public string Expression;
      }
    }
    不知道红色部份的方法是不是楼主想要的。只不过创建类的时候是在内存中,没有输入的磁盘上
      

  10.   

       private void ConstructEvaluator(EvaluatorItem[] items)
        {
          ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
          CompilerParameters cp = new CompilerParameters();
          cp.ReferencedAssemblies.Add("system.dll");
          cp.ReferencedAssemblies.Add("system.data.dll");
          cp.ReferencedAssemblies.Add("system.xml.dll");
          cp.GenerateExecutable = false;
          cp.GenerateInMemory = true;      StringBuilder code = new StringBuilder();
          code.Append("using System; \n");
          code.Append("using System.Data; \n");
          code.Append("using System.Data.SqlClient; \n");
          code.Append("using System.Data.OleDb; \n");
          code.Append("using System.Xml; \n");
          code.Append("namespace ADOGuy { \n");
          code.Append("  public class _Evaluator { \n");
          foreach(EvaluatorItem item in items)
          {
            code.AppendFormat("    public {0} {1}() ", 
                              item.ReturnType.Name, 
                              item.Name);
            code.Append("{ ");
            code.AppendFormat("      return ({0}); ", item.Expression);
            code.Append("}\n");
          }
          code.Append("} }");      CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
          if (cr.Errors.HasErrors)
          {
            StringBuilder error = new StringBuilder();
            error.Append("Error Compiling Expression: ");
            foreach (CompilerError err in cr.Errors)
            {
              error.AppendFormat("{0}\n", err.ErrorText);
            }
            throw new Exception("Error Compiling Expression: " + error.ToString());
          }
          Assembly a = cr.CompiledAssembly;
          _Compiled = a.CreateInstance("ADOGuy._Evaluator");
        }
        #endregion格式变了,重新给你发一下这个方法
      

  11.   

    你直接用代码创建一个文件, 后缀为.cs就可以了
    system.file类就可以了