Last active
November 16, 2020 23:35
-
-
Save aetos382/59e521c2307f4d2e3c1e628377dc2e6d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| void Main() | |
| { | |
| var instance = new First { | |
| Second = new Second { | |
| Third = new Third { | |
| Value = 100 | |
| } | |
| } | |
| }; | |
| instance.Dump(); | |
| var instanceParameter = Expression.Parameter(typeof(object)); | |
| var valueParameter = Expression.Parameter(typeof(object)); | |
| var names = new[] { | |
| nameof(First.Second), | |
| nameof(Second.Third), | |
| nameof(Third.Value) | |
| }; | |
| Expression expression = Expression.Convert(instanceParameter, typeof(First)); | |
| foreach (var name in names) | |
| { | |
| expression = Expression.PropertyOrField(expression, name); | |
| } | |
| var getterLambda = Expression.Lambda<Func<object, object>>( | |
| Expression.Convert( | |
| expression, | |
| typeof(object)), | |
| instanceParameter); | |
| getterLambda.Dump(); | |
| var getterDelegate = getterLambda.Compile(); | |
| getterDelegate(instance).Dump(); | |
| var setterLambda = Expression.Lambda<Action<object, object>>( | |
| Expression.Assign( | |
| expression, | |
| Expression.Convert( | |
| valueParameter, | |
| typeof(int))), | |
| instanceParameter, valueParameter); | |
| setterLambda.Dump(); | |
| var setterDelegate = setterLambda.Compile(); | |
| setterDelegate(instance, 200); | |
| instance.Dump(); | |
| } | |
| class First | |
| { | |
| public Second Second { get; set; } | |
| } | |
| class Second | |
| { | |
| public Third Third { get; set; } | |
| } | |
| class Third | |
| { | |
| public int Value { get; set; } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment