Estoy escribiendo un servicio para tomar una colección de objetos de un tipo particular y output its primitive, string, and DateTime types a una cadena en CSV Format. Tengo ambas afirmaciones a continuación trabajando. Encuentro que la versión basada en lambda es mucho más limpia.Usando una expresión lambda para evitar el uso de una "cadena mágica" para especificar una propiedad
magia cadena de versión
string csv = new ToCsvService<DateTime>(objs)
.Exclude("Minute")
.ChangeName("Millisecond", "Milli")
.Format("Date", "d")
.ToCsv();
vs Lambda Versión
string csv = new ToCsvService<DateTime>(objs)
.Exclude(p => p.Minute)
.ChangeName(p => p.Millisecond, "Milli")
.Format(p => p.Date, "d")
.ToCsv();
recomendación por Jon Skeet todos los métodos lambda comparten un método de firma similares
public IToCsvService<T> Exclude<TResult>(
Expression<Func<T, TResult>> expression)
Luego paso el expression.Body
al FindMemberExpression
. He adaptado código del FindMemberExpression
method of ExpressionProcessor.cs del nhlambdaextensions project. Mi versión muy similar de FindMemberExpression
es el siguiente:
private string FindMemberExpression(Expression expression)
{
if (expression is MemberExpression)
{
MemberExpression memberExpression = (MemberExpression)expression;
if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess
|| memberExpression.Expression.NodeType == ExpressionType.Call)
{
if (memberExpression.Member.DeclaringType.IsGenericType
&& memberExpression.Member.DeclaringType
.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if ("Value".Equals(memberExpression.Member.Name))
{
return FindMemberExpression(memberExpression.Expression);
}
return String.Format("{0}.{1}",
FindMemberExpression(memberExpression.Expression),
memberExpression.Member.Name);
}
}
else
{
return memberExpression.Member.Name;
}
}
throw new Exception("Could not determine member from "
+ expression.ToString());
}
estoy probando para bastantes casos en los FindMemberExpression
? ¿Es lo que estoy haciendo excesivo dado mi caso de uso?
OT: yowser; alrededor de 4 días a partir de 200 k? –
Para reconocer una propiedad solo estaba usando la ruta 'UnaryExpression' y una versión simplificada de la ruta' MemberExpression'. ¿Hay un mecanismo aún más limpio que el que he esbozado? – ahsteele
@Marc: De hecho, 3 si tengo mucha suerte :) –