Linq比较2个对象

时间:2013-05-15 10:06:08

标签: c#

我有两个对象。

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中删除该属性。然后我需要从A中删除属性UserSettings,如下所示。

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

是否可以执行此操作linq

3 个答案:

答案 0 :(得分:1)

如果您真的想要自动化,可以使用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();

答案 1 :(得分:1)

鉴于您的问题中的“删除”部分,我认为使用Dictionary而不是Type进行设置会更好。

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

答案 2 :(得分:0)

尝试这样的事情:UserSettings继承自GlobalSettings,在此示例中,如果您使用UserSettings.A,if将检查其父类中是否为false,并使用UserSettings.A if它是假的,而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;
        }
    }
}