如何在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 的类的 Equals
和 GetHashCode
方法@。
我有一个名为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 拦截器
Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration