using System.Linq.Expressions;
using System.Reflection;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Demon demon = new() { MyField = 1, MyProperty = 2, };
void Modify<T>(ref T field, T newValue)
{
field = newValue;
}
void ModifyProperty<T>(Action<T> action, T newValue)
{
action.Invoke(newValue);
}
void ModifyPropertyByRelection<TClass, TProperty>(MethodInfo methodInfo, TClass target,TProperty newValue)
{
methodInfo.Invoke(target, new object?[] { newValue });
}
void ModifyPropertyWithExpression<TProperty, TClass>(Expression<Func<Demon, TProperty>> expression, TClass target, TProperty newValue)
{
var body = (MemberExpression)expression.Body;
var prop = body.Member as PropertyInfo;
var setMethod = prop!.GetSetMethod();
setMethod?.Invoke(target, new object?[] { newValue });
}
ModifyPropertyWithExpression(d => d.MyProperty, demon, 42);
Console.WriteLine(demon.MyProperty);
var method = typeof(Demon).GetProperty(nameof(demon.MyProperty))!.GetSetMethod()!;
ModifyPropertyByRelection(method, demon,88);
Console.WriteLine(demon.MyProperty);
Modify(ref demon.MyField, 55);
Console.WriteLine(demon.MyField);
ModifyProperty(x=> demon.MyProperty = x, 66);
Console.WriteLine(demon.MyProperty);
}
class Demon
{
public int MyProperty { get; set; }
public int MyField;
}
}
}
