我想要一个方法、注释或其他可以让我将字符串视为 C# 代码的东西。
我阅读了有关 CodeDom、Reflection 和 T4 模板的信息,但这不是我想要的。
我需要的是更简单的,我希望。我不想在运行时生成代码。
这是一个说明我想要什么的例子。我正在使用 VS2010、Entity Framework 5 和 Code First 方法。
我对每种实体类型都有一个 Insert 方法。以下是插入Cliente
(Costumer) 的方法的代码。如果 aCliente
存在于数据库中,则更新而不是插入:
public int InsertarCliente(Cliente cliente)
{
int id = cliente.ClienteId;
try
{
if (id != -1)
{
var clt = db.Clientes.Find(id);
clt.Nombre = cliente.Nombre;
clt.Apellido1 = cliente.Apellido1;
clt.Apellido2 = cliente.Apellido2;
// more similar statements
}
else
db.Clientes.Add(cliente);
db.SaveChanges();
return cliente.ClienteId;
}
catch (DbEntityValidationException exc)
{
// code
}
}
我试图使用 CodeDom 创建一个适用于任何实体类型的通用方法。该方法不起作用,我知道为什么:CodeDom 不会编译和运行任意代码,它需要额外的命名空间、using 语句、类、方法等。该方法不起作用,这里是澄清我的代码试图做:
public int Insertar<TEntity>(TEntity entidad, string[] atributos)
where TEntity : class
{
string nombreEntidad = entidad.GetType().Name;
string entidadId = nombreEntidad + "Id";
string tabla = nombreEntidad + "s";
int id = Convert.ToInt32(
entidad.GetType().GetProperty(entidadId).GetValue(entidad, null));
try
{
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
CompilerResults cr;
string codigo;
if (id != -1)
{
codigo = "var entidadAlmacenada = db." + tabla + ".Find(id);";
cr = codeProvider.CompileAssemblyFromSource(cp, codigo);
CompilerResults cr2;
string codigoActualizador;
foreach (string atr in atributos)
{
codigoActualizador =
"entidadAlmacenada." + atr + " = entidad." + atr + ";";
cr2 = codeProvider.CompileAssemblyFromSource(
cp, codigoActualizador);
}
}
else
{
codigo = "db." + tabla + ".Add(entidad);";
cr = codeProvider.CompileAssemblyFromSource(cp, codigo);
}
db.SaveChanges();
return Convert.ToInt32(
entidad.GetType().GetProperty(entidadId).GetValue(entidad, null));
}
catch (DbEntityValidationException exc)
{
// code
}
}
我想要一种将表示代码的字符串转换(内联)为它表示的代码的方法。
就像是:
string code = "line of code";
code.toCode(); // or
toCode(code); // or
[ToCode]
code;
对不起,如果我写得太多,但这次我想清楚一点。
我需要的是在编译时间之前将字符串“包含代码”替换为代码。没有运行时编译或执行。
有没有办法做这样的事情?
TIA
编辑:
上面的例子只是一个例子。但是在任何情况下我都想要“字符串到代码的转换”。