Aquí hay un ejemplo de cómo usar System.Linq.Expressions
para agregar a la respuesta de Tim. Obviamente, no es el código más bonito, pero tenerlo en esta bonita forma de árbol hace que el desarrollo sea tan fácil.
private Expression<IsWordChar> CreateIsWordCharExpression()
{
var e = Expression.Parameter(typeof(int), "e");
var c = Expression.Variable(typeof(char), "c");
var returnLabel = Expression.Label(Expression.Label(typeof(bool)), _falseConstant);
var lambda = Expression.Lambda<IsWordChar>(
Expression.Block(
new[] { c },
Expression.IfThen(
Expression.OrElse(
Expression.Equal(e, Expression.Constant(-1)),
Expression.Equal(e, _inputLengthVar)
),
Expression.Return(returnLabel.Target, _falseConstant)
),
Expression.Assign(c, Expression.MakeIndex(_str, _stringCharsPropertyInfo, new[] { e })),
Expression.IfThenElse(
Expression.OrElse(
Expression.OrElse(
Expression.OrElse(
Expression.AndAlso(
Expression.GreaterThanOrEqual(c, Expression.Constant('a')),
Expression.LessThanOrEqual(c, Expression.Constant('z'))
),
Expression.AndAlso(
Expression.GreaterThanOrEqual(c, Expression.Constant('A')),
Expression.LessThanOrEqual(c, Expression.Constant('Z'))
)
),
Expression.AndAlso(
Expression.GreaterThanOrEqual(c, Expression.Constant('0')),
Expression.LessThanOrEqual(c, Expression.Constant('1'))
)
),
Expression.Equal(c, Expression.Constant('_'))
),
Expression.Return(returnLabel.Target, _trueConstant),
Expression.Return(returnLabel.Target, _falseConstant)
),
returnLabel
),
"IsWordChar",
new[] { e }
);
return lambda;
}
'GenerateInMemory = true' no hace lo que su nombre sugiere; genera un ensamblado en el directorio temporal que debe eliminar una vez que haya terminado. –
@Tim: admitiré que no estoy familiarizado con el CodeDom, pero no he podido encontrar ninguna evidencia que respalde esto (en mi disco duro en el directorio 'temp' o en el directorio de la aplicación, ni en la web en una búsqueda rápida). ¿Podría indicarme un recurso que pueda confirmar esto? –
OK - La última vez que hice esto, debo haber guardado los ensamblados en el disco para la depuración. Puedo ver que 'CSharpCodeProvider' se compila en un archivo temporal, carga ese archivo usando' Assembly.Load (byte []) ', luego lo elimina. (No puede eludir por completo el archivo temporal porque ejecuta _csc.exe_ debajo.) –