文字列を C# コードとして扱えるようにするメソッド、注釈、またはその他のものが必要です。
CodeDom、Reflection、および T4 テンプレートについて読みましたが、それは私が探しているものではありません。
私が必要としているのはもっと単純なことです。実行時にコードを生成したくありません。
これが私が望むものを明確にするための例です。VS2010、Entity Framework 5、および Code First アプローチを使用しています。
エンティティ タイプごとに Insert メソッドがあります。Cliente
以下は、 (コスチューム)を挿入するメソッドのコードです。Cliente
がデータベースに存在する場合、挿入ではなく更新されます。
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 は任意のコードをコンパイルおよび実行しません。ステートメント、クラス、メソッドなどを使用して、追加の名前空間が必要です。そのメソッドは機能しません。やろうとしていた:
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;
書きすぎて申し訳ありませんが、今回ははっきりさせておきたいと思います。
私が必要とするのは、「コードを含む」文字列をコンパイル前にコードに置き換えることです。実行時のコンパイルや実行はありません。
そのようなことをする方法はありますか?
ティア
編集:
上記の例はほんの一例です。しかし、どのような状況でも「文字列からコードへの変換」が必要です。