Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public static int GetSecretUsingExpressionTrees(this SecretKeeper keeper)
{
ParameterExpression keeperArg = Expression.Parameter(typeof(SecretKeeper), "keeper"); // SecretKeeper keeper argument
Expression secretAccessor = Expression.Field(keeperArg, "_secret"); // keeper._secret
var lambda = Expression.Lambda<Func<SecretKeeper, int>>(secretAccessor, keeperArg);
var func = lambda.Compile(); // Получается функция return result = keeper._secret;
return func(keeper);
}
public void DoSomething(Example example) { this.JustInt = example.JustInt; // Вполне валидная строка, некоторых удивляет }
Для красоты рефлексию можно завернуть в DynamicObject:
List<int> realList = new List<int>();
dynamic exposedList = ExposedObject.From(realList);
// Read a private field - prints 0
Console.WriteLine(exposedList._size);Подробности и ссылка на библиотеку.
Таким же образом можно завернуть и вариант с expression trees.
Четыре способа извлечения значений из скрытых полей в C#