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

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

阅读 Castle.Core 文档,在 this link 中,他们建议总是覆盖 EqualsGetHashCode 方法实现 IproxygenerationHook 的类。

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

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();
}

解决方法

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

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

什么使 MiHook 类型的两个对象相等?

根据您对 ShouldInterceptMethod 的实现判断,它是 Type(IFoo.Bar)。如果是这种情况,我会选择 IFoo.Bar - “依赖”覆盖:

   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 的 source file 的链接。

也许它作为灵感来源很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?