Skip to content

Instantly share code, notes, and snippets.

@aetos382
Last active November 16, 2020 23:35
Show Gist options
  • Select an option

  • Save aetos382/59e521c2307f4d2e3c1e628377dc2e6d to your computer and use it in GitHub Desktop.

Select an option

Save aetos382/59e521c2307f4d2e3c1e628377dc2e6d to your computer and use it in GitHub Desktop.
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