Я пишу сервис, чтобы взять набор объектов конкретного типа и произвести его примитив, строку и типы DateTime к строке в формате CSV. У меня есть оба из ниже работы операторов. Я нахожу, что основанная на лямбде версия является намного более чистой.
Волшебная строковая версия
string csv = new ToCsvService(objs)
.Exclude("Minute")
.ChangeName("Millisecond", "Milli")
.Format("Date", "d")
.ToCsv();
по сравнению с версией лямбды
string csv = new ToCsvService(objs)
.Exclude(p => p.Minute)
.ChangeName(p => p.Millisecond, "Milli")
.Format(p => p.Date, "d")
.ToCsv();
На рекомендацию Jon Skeet все методы лямбды совместно используют подпись похожего метода
public IToCsvService Exclude(
Expression> expression)
Я затем передаю expression.Body
кому: FindMemberExpression
. Я адаптировал код от FindMemberExpression
метод ExpressionProcessor.cs из nhlambdaextensions проекта. Моя очень похожая версия FindMemberExpression
ниже:
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());
}
Я тестирую на достаточное количество случаев в FindMemberExpression
? То, что я делаю излишество, учитывая свой вариант использования?