Linq比较2个对象

本文关键字:对象 2个 比较 Linq | 更新日期: 2023-09-27 18:13:33

我有两个对象。

public class GlobalSettings
{
    public bool A { get; set; }
    public bool B { get; set; }
    public bool C { get; set; }
    public bool D { get; set; }
}
public class UserSettings
{
    public bool A { get; set; }
    public bool B { get; set; }
    public bool C { get; set; }
    public bool D { get; set; }
}

我需要比较这两个物体。根据GlobalSettings的属性值,我需要从UserSettings中删除该属性。

例如

GlobalSettings属性A值为false意味着我想从UserSettings中删除该属性。然后我需要从UserSettings中删除属性A,如下所示。

public class UserSettings
{
    public bool B { get; set; }
    public bool C { get; set; }
    public bool D { get; set; }
}

有可能做这个linq吗?

Linq比较2个对象

如果你真的想自动化这一点,你可以使用Linq和反射,例如

  var query = from aProp in a.GetType().GetProperties()
              let aValue = aProp.GetValue(a)
              let bProp = b.GetType().GetProperty(aProp.Name)
              let bValue = bProp.GetValue(b)
              where !aValue.Equals(bValue)
              select new { aProp.Name, aValue, bValue };
  var allTheSame = !query.Any();

考虑到问题中的"删除"部分,我认为您最好使用Dictionary而不是Type进行设置。

您不能从普通静态C#类型中删除属性,但可以使用Remove(key)方法轻松地从Dictionaries中删除条目。

试试这样的方法:UserSettings继承自GlobalSettings,在本例中,如果您使用UserSettings.A,if将在其父类中检查是否为false,如果为false,则使用UserSettings.A,如果为true,则使用GlobalSettings.A。

public class GlobalSettings
{
    public virtual bool A { get; set; }
}
public class UserSettings : GlobalSettings
{
    public override bool A 
    { 
        get 
        { 
            return base.A  ? base.A : A;
        }
        set
        {
            this.A = value;
        }
    }
}