c# 创建类(.cs) 不用Stream创建有没有其他的,比如创建xml有xmlDocument 这样可以有相对的格式,创建.cs文件有没有相关的对象? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ... 啊,我是要创建.cs 希望像手动创建那样代码规整呢,Stream的话 代码就会比较乱啊 System.CodeDom内容可能太短 ??动态创建类???和你cs文件有何关系,cs是输出,类是运行期??如果要动态创建,运行期类,参考codedom如果要输出cs文件,参考Microsoft.CSharp.CSharpCodeProvider类 不大明白楼主的意思难道要用codesmith模板吗,那样创建出来的就和写的一样了 LZ是不是要生成一个cs文件阿?但又要像自己在VS里写的那样自动缩进? 楼主是想根据类图之类的东西生成.cs文件吧CodeDom 不知道lz的意思是否是这样http://www.dotnetspider.com/resources/565-Generating-C-Class-File-Sample-cs-Dynamically-us.aspx 除了用Stream的这种 有没有其他方法呀? 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; }}不知道红色部份的方法是不是楼主想要的。只不过创建类的时候是在内存中,没有输入的磁盘上 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格式变了,重新给你发一下这个方法 你直接用代码创建一个文件, 后缀为.cs就可以了system.file类就可以了 根据MAC地址和已生成的KEY(字符串),能知道如何加密的吗 c#判断是不是搜索引擎 C# 如何在点击ok前获取调色板选择的颜色 求一个PluginInstaller.msi下载地址! 删除数据的问题? 急急急 准备转行回家开个太阳能专卖请大家给个意见? 多线程下载问题 能不能把资源文件编译到DLL文件中? c#如何列出局域网内所有计算机? 我用C#的SMTP发邮件时要身份验证,,有没有不要身份验证的邮件服务,还有下面这个发送邮件的代码要引用什么空间, 刚从ASP转.NET,请教下循环的问题 menustrip扩展
内容可能太短
动态创建类
???
和你cs文件有何关系,cs是输出,类是运行期??如果要动态创建,运行期类,参考codedom
如果要输出cs文件,参考Microsoft.CSharp.CSharpCodeProvider类
CodeDom
http://www.dotnetspider.com/resources/565-Generating-C-Class-File-Sample-cs-Dynamically-us.aspx
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;
}
}
不知道红色部份的方法是不是楼主想要的。只不过创建类的时候是在内存中,没有输入的磁盘上
{
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格式变了,重新给你发一下这个方法
system.file类就可以了