C# 寻找内置类,如StructuralEqualityComparer<;T>;具有通用版本

C# 寻找内置类,如StructuralEqualityComparer<;T>;具有通用版本,c#,linq,C#,Linq,假设我有两个类A和B,它们具有不同数量的属性: class A { public int Pro1 { get; set; } public string Pro2 { get; set; } } class B { public int Pro1 { get; set; } public string Pro2 { get; set; } public bool Pro3 { get; set; } } 为了在Lamda方法中使用结构等式比较

假设我有两个类
A
B
,它们具有不同数量的属性:

class A
{
    public int Pro1  { get; set; }
    public string Pro2 { get; set; }   
}

class B
{
    public int Pro1 { get; set; }
    public string Pro2 { get; set; }
    public bool Pro3 { get; set; }
}
为了在Lamda方法中使用结构等式比较,例如:Distinct、INTESTICT。。。我必须构建两个自定义的
EqualityComparer

public class CustomComparerA : EqualityComparer<A> {} 
// use all Pro1 and Pro2

public class CustomComparerB : EqualityComparer<B> {} 
// use all Pro1, Pro2 and Pro3
这样我就可以重复使用:

listA.Distinct(new Structuralequalitycomparer<A>())
listA.Distinct(new Structuralequalitycomparer<B>())
listA.Distinct(新的Structuralequalitycomparer())
Distinct(新的Structuralequalitycomparer())
有人知道内置类.NET支持这一点吗?若否,原因为何


还是我们必须自己管理?

我自己已经设法构建了
结构平等比较程序
,因为.NET不支持这一点,原因如DasbLinkedlight的回答所述,谢谢DasbLinkedlight

private class StructuralEqualityComparer<T> : EqualityComparer<T> where T : class
{
    public override bool Equals(T x, T y)
    {
        return typeof(T).GetProperties()
                         .All(pro => pro.GetValue(x).Equals(pro.GetValue(y)));

    }

    public override int GetHashCode(T obj)
    {
        int hashCode = typeof(T).GetProperties()
                                .Aggregate(0, (current, pro) => 
                                     current ^ pro.GetValue(obj).GetHashCode());

        return hashCode.GetHashCode();
    }
}
私有类结构EqualityComparer:EqualityComparer,其中T:class
{
公共覆盖布尔等于(TX,TY)
{
返回typeof(T).GetProperties()
.All(pro=>pro.GetValue(x).Equals(pro.GetValue(y));
}
公共覆盖int GetHashCode(T obj)
{
int hashCode=typeof(T).GetProperties()
.合计(0,(当前,专业)=>
当前^pro.GetValue(obj.GetHashCode());
返回hashCode.GetHashCode();
}
}

查看
StructuralEqualityComparer
,它实际上没有做任何有趣的事情。它只是询问第一个对象是否等于第二个对象,如果它存在,则使用一个特定的接口。这将非常缓慢,因为它将在非常时间敏感的操作中使用反射API。您可以相对容易地将它们转换为LINQ表达式并编译它们,遵循我的答案中的建议和您的答案代码作为构建这些表达式的模板。
private class StructuralEqualityComparer<T> : EqualityComparer<T> where T : class
{
    public override bool Equals(T x, T y)
    {
        return typeof(T).GetProperties()
                         .All(pro => pro.GetValue(x).Equals(pro.GetValue(y)));

    }

    public override int GetHashCode(T obj)
    {
        int hashCode = typeof(T).GetProperties()
                                .Aggregate(0, (current, pro) => 
                                     current ^ pro.GetValue(obj).GetHashCode());

        return hashCode.GetHashCode();
    }
}