using System.Collections.Generic;
using System.Linq.Expressions;
public int Id { get; set; }
public string Phone { get; set; }
public string Name { get; set; }
public static Expression<Func<Person, object>>[] SelectAll(){
return new Expression<Func<Person, object>>[]{ x=>x.Id, x=>x.Phone, x=>x.Name};
static void Main(string[] args)
var personReceiveValues = new Person { Id=1, Phone = "1111111111", Name="A" };
var personNewValues = new Person { Id=0, Phone = "3333333333", Name="C" };
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
UpdateObj<Person>(personReceiveValues, personNewValues, x => x.Phone);
Console.WriteLine(JsonSerializer.Serialize(personNewValues));
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
Console.WriteLine("---------------");
personReceiveValues = new Person { Id=1, Phone = "1111111111", Name="A" };
personNewValues = new Person { Id=0, Phone = "3333333333", Name="C" };
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
UpdateObj<Person>(personReceiveValues, personNewValues, x => x.Phone,x=>x.Name);
Console.WriteLine(JsonSerializer.Serialize(personNewValues));
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
Console.WriteLine("---------------");
personReceiveValues = new Person { Id=1, Phone = "1111111111", Name="A" };
personNewValues = new Person { Id=0, Phone = "3333333333", Name="C" };
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
var a = Person.SelectAll();
UpdateObj<Person>(personReceiveValues, personNewValues, a);
Console.WriteLine(JsonSerializer.Serialize(personNewValues));
Console.WriteLine(JsonSerializer.Serialize(personReceiveValues));
Console.WriteLine("---------------");
var watch = System.Diagnostics.Stopwatch.StartNew();
for(int i =0;i<runTimes;i++){
personReceiveValues = new Person { Id=1, Phone = "1111111111", Name="A" };
personNewValues = new Person { Id=0, Phone = "3333333333", Name="C" };
UpdateObj<Person>(personReceiveValues, personNewValues, x => x.Phone,x=>x.Name);
float elapsed1 = watch.ElapsedMilliseconds;
Console.WriteLine("run time 1: "+elapsed1);
watch = System.Diagnostics.Stopwatch.StartNew();
for(int i =0;i<runTimes;i++){
personReceiveValues = new Person { Id=1, Phone = "1111111111", Name="A" };
personNewValues = new Person { Id=0, Phone = "3333333333", Name="C" };
UpdateObj<Person>(personReceiveValues, personNewValues, x => x.Phone,x=>x.Name);
personReceiveValues.Name = personNewValues.Name;
personReceiveValues.Phone = personNewValues.Phone;
float elapsed2 = watch.ElapsedMilliseconds;
Console.WriteLine("run time 2: "+elapsed2);
float deltaElpased = elapsed1 - elapsed2;
Console.WriteLine("diff: "+deltaElpased);
Console.WriteLine(((deltaElpased/elapsed2)*100)+"%");
static void UpdateObj<T>(T objToUpdate, T objWithValues, params Expression<Func<T, object>>[] selectors)
var properties = new List<Expression<Func<T, object>>>();
foreach(var selector in selectors){
var memberInitExpression = selector.Body as MemberExpression;
while (memberInitExpression != null)
properties.Add(Expression.Lambda<Func<T, object>>(memberInitExpression, selector.Parameters));
memberInitExpression = memberInitExpression.Expression as MemberExpression;
foreach (var fieldSelector in properties)
if (fieldSelector.Body is MemberExpression memberExpression)
if (memberExpression.Member is PropertyInfo property)
var newValue = fieldSelector.Compile()(objWithValues);
property.SetValue(objToUpdate, newValue);