如何在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。
也许它可以作为灵感的来源。
阅读 Castle.Core 文档,在 this link 中,他们建议 始终 覆盖 Equals
和实现 IProxyGenerationHook
.
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。
也许它可以作为灵感的来源。