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

Posted

技术标签:

【中文标题】如何在Castle.Core中实现IProxyGenerationHook的类中实现Equals和GetHashCode的覆盖方法?【英文标题】:How to implement the override methods of Equals and GetHashCode in a class that implements IProxyGenerationHook in Castle.Core? 【发布时间】:2021-04-18 17:06:39 【问题描述】:

阅读 this link 中的 Castle.Core 文档,他们建议始终覆盖实现 @987654324 的类的 EqualsGetHashCode 方法@。

我有一个名为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();

【问题讨论】:

该类没有字段,因此没有状态,您无法有意义地覆盖 GetHashCode()。 Object.GetHashCode() 没什么问题,它生成的哈希非常好。怀疑引用的建议是否明智,我不知道该库,但我无法想象您创建了该类的多个实例。 @HansPassant 是的,创建多个对象实例的情况很少见,但最好考虑一下说明,因为文档没有指定如何实现这两种方法。 【参考方案1】:

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

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

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

根据您对ShouldInterceptMethod 的实现判断,它是类型(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

【讨论】:

I'm not sure what do you mean by stateless class - do you mean that it doesn't have any fields? 没错,一个没有字段来存储对象状态的类,但不一定是不可变的。 GetHashCode 方法的代码很有趣,我只会稍作改动,因为正如您所说,它是无效的。像更新#1这样的东西我会等一下,看看是否有另一个更接近使用库的答案。即便如此,谢谢!【参考方案2】:

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

private IEnumerable<IAlternateMethod> methodImplementations;

这里是指向包含 GetHashCode 和 Equals 方法的 source file 的链接。

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

【讨论】:

谢谢,可惜它的类不是无状态的

以上是关于如何在Castle.Core中实现IProxyGenerationHook的类中实现Equals和GetHashCode的覆盖方法?的主要内容,如果未能解决你的问题,请参考以下文章

注册/使用 Castle.Core.AsyncInterceptor 拦截器

切面编程AOP之Castle.Core

Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration

Abp 源码研读 - 依赖注入

Castle.DynamicProxy拦截器

如何在android中实现svm模型?