Используя лямбда-выражение для избегания использования “волшебной строки” для определения свойства

Я пишу сервис, чтобы взять набор объектов конкретного типа и произвести его примитив, строку и типы 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? То, что я делаю излишество, учитывая свой вариант использования?

6
задан Community 23 May 2017 в 12:19
поделиться