Посмотрите библиотеку Heleonix.Reflection . Вы можете получить / установить / вызывать членов по путям или создать геттер / сеттер (lambda, скомпилированный в делегат), который быстрее, чем отражение. Например:
var success = Reflector.Get(DateTime.Now, null, "Date.Year", out int value);
Или создайте геттер один раз и кеш для повторного использования (это более результативно, но может вызывать исключение NullReferenceException, если промежуточный элемент равен нулю):
var getter = Reflector.CreateGetter("Date.Year", typeof(DateTime));
getter(DateTime.Now);
Или если вы хотите создать List
разных геттеров, просто укажите базовые типы для скомпилированных делегатов (типы конверсий будут добавлены в скомпилированные lambdas):
var getter = Reflector.CreateGetter