如何在Castle.Core中实现IProxyGenerationHook的class中实现Equals和GetHashCode的覆盖方法?

How to implement the override methods of Equals and GetHashCode in a class that implements IProxyGenerationHook in Castle.Core?

阅读 Castle.Core 文档,在 this link 中,他们建议 始终 覆盖 Equals 和实现 IProxyGenerationHook.

的 classes 的 GetHashCode 方法

我有一个名为 MiHook 的 class 实现了这样的接口,但是这个 class 没有状态。所以,我的问题是,如果我有一个无状态 class,我应该如何覆盖这两个方法?

public class MiHook : IProxyGenerationHook {
    public void MethodsInspected() { }

    public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo) { }

    public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo) {
        return methodInfo.Name == nameof(IFoo.Bar);
    }

    // Should I implement both methods like this?
    public override bool Equals(object? obj) => base.Equals(obj);
    public override int GetHashCode() => base.GetHashCode();
}

我不确定无状态是什么意思 class - 您是说它没有任何字段吗? what is a stateless class?

您示例中的基本实现与根本不覆盖一样好。你需要问自己一个问题:

What makes two objects of type MiHook equal?

根据您对 ShouldInterceptMethod 的实施判断,它是 Type(IFoo.Bar)。如果是这样的话,我会选择 IFoo.Bar - "dependent" override:

   public class MiHook : IProxyGenerationHook
    {
        public void MethodsInspected() { }
        public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo) { }
        public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo)
        {
            return methodInfo.Name == nameof(IFoo.Bar);
        }
        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != this.GetType()) return false;
            return obj.GetHashCode() == this.GetHashCode();
        }
        public override int GetHashCode() => typeof(IFoo.Bar).GetHashCode();
    }

测试一下:

var mh1 = new MiHook<Foo.Bar>();
var mh2 = new MiHook<Foo.Bar>();
Console.WriteLine(mh1.Equals(mh2)); //True
//your implementation returns False

在 Glimpse 项目中,IProxyGenerationHook 也被覆盖。尽管他们仍然有一个用于覆盖 GetHashCode 和 Equals 的私有字段:

private IEnumerable<IAlternateMethod> methodImplementations;

这是包含方法 GetHashCode 和 Equals 的 link 到 source file

也许它可以作为灵感的来源。