C# 反映和比较复杂类型的属性值?

C# 反映和比较复杂类型的属性值?,c#,reflection,C#,Reflection,下面的函数AssignIfDiff在变量与参数不同时分配变量,可以很好地处理简单类型。然而,它似乎有复杂类型的问题?如何使其在复杂类型上工作 class C { int A { get; set; } List<AClass> B { get; set; } ...... } C _c = new C(....); // To be updated int v = 1; AssignIfDiff(v, x => x.A); // Upda

下面的函数AssignIfDiff在变量与参数不同时分配变量,可以很好地处理简单类型。然而,它似乎有复杂类型的问题?如何使其在复杂类型上工作

class C 
{ 
     int A { get; set; } 
     List<AClass> B { get; set; }
     ...... 
}
C _c = new C(....); // To be updated

int v = 1;
AssignIfDiff(v, x => x.A); // Update _c.A if it's different than v. It works well.
var b = new List<AClass>(); .....
AssignIfDiff(b, x => x.B); // ???

void AssignIfDiff<T>(T curr, Expression<Func<C, T>> prev)
{
    var expr = (MemberExpression)prev.Body;
    var prop = (PropertyInfo)expr.Member;
    if (!EqualityComparer<T>.Default.Equals(curr, (T)_c[prop.Name]))
    {
        prop.SetValue(_c, curr, null); // Update the property of _c if diff than curr
          ...... 
    }
}

AClass是一个随机类吗?还有你的函数赋值diff access?是的,AClass可以是任何随机类。右_c应作为参数传递。该函数的一个主要用途是更新_c。我不明白什么是_c,似乎c实现了方括号,它是某种容器还是字典?为什么不编译并调用表达式并使用Object.Equals?或者只是T prevObj=prev.Compile.Invoke_c;ifprevObj!=curr{prop.SetValue_c,curr,null;}当您说AssignIfDiff对复杂类型有问题时,问题到底是什么?问题可能出在AClass的平等性检查代码中,例如重写的Equals方法声称AClass的所有实例都是彼此平等的?