Вы можете использовать отражения, если не возражаете против потери безопасности статического типа. Я возражаю, поэтому я просто использую вашу первую конструкцию с коротким замыканием. Хотелось бы упомянуть такую функцию, как Эрик:)
Я думал об этой проблеме несколько раз. В Lisp есть макросы, которые решают проблему так, как вы упомянули, так как они позволяют вам настраивать оценку.
Я также пытался использовать методы расширения для решения этой проблемы, но нет ничего менее уродливого, чем оригинальный код.
Редактировать: (Ответы не позволяют мне вставлять блоки кода, поэтому редактирование моего сообщения)
Упс, не поспевал за этим. К сожалению об этом:)
Вы можете использовать отражения для поиска и оценки члена или свойства через строку. Класс, который написал один из моих друзей, имел следующий синтаксис:
new ReflectionHelper(obj)["Parameters"]["UserSettings"]
Это работало через цепочку методов, возвращая ReflectionHelper на каждом уровне. Я знаю, что NullReferenceException является проблемой в этом примере. Я просто хотел продемонстрировать, как оценка может быть отложена до времени выполнения.
Пример, чуть более близкий к полезности:
public class Something
{
public static object ResultOrDefault(object baseObject, params string[] chainedFields)
{
// ...
}
}
Опять же, этот синтаксис воняет. Но это демонстрирует использование строк + отражений для переноса оценки во время выполнения.