Вы можете использовать это вне или внутри класса, это работает только для полей прямо сейчас, но вы можете изменить его для свойств, если хотите.
public static Func<T, R> GetFieldAccessor<T, R>(string fieldName)
{
ParameterExpression param =
Expression.Parameter(typeof(T), "arg");
MemberExpression member =
Expression.Field(param, fieldName);
LambdaExpression lambda =
Expression.Lambda(typeof(Func<T, R>), member, param);
Func<T, R> compiled = (Func<T, R>)lambda.Compile();
return compiled;
}
использование будет выглядеть примерно так:
public class MyClass
{
private int _secret = 10;
}
var myClass = new MyClass();
Console.WriteLine("func:" + GetFieldAccessor<MyClass, int>("_secret").Invoke(myClass));