Это немного сложно. Посмотрите документацию о том, как работают прокси. Интерфейсные прокси обертывают объект и перехватывают вызовы к назначенному интерфейсу (ам). Поскольку Equals
не является частью этого интерфейса, второй вызов функции equals сравнивает прокси, а не их цели.
Так, что обеспечивает реализацию для второго Equals
вызова?
Proxy - это просто еще один класс, реализующий ваш IDummy
интерфейс. Как и любой класс, он также имеет базовый класс, и это базовая реализация Equals
, которая вызывается. Этот базовый класс по умолчанию System.Object
Надеюсь, теперь вы видите, куда это идет. Решением этой проблемы является указание прокси-серверу реализовать базовый класс с поддержкой прокси, который будет переадресовывать вызовы на цель прокси. Часть его реализации может выглядеть так:
public class ProxyBase
{
public override bool Equals(object obj)
{
var proxy = this as IProxyTargetAccessor;
if (proxy == null)
{
return base.Equals(obj);
}
var target = proxy.DynProxyGetTarget();
if (target == null)
{
return base.Equals(obj);
}
return target.Equals(obj);
}
// same for GetHashCode
}
Теперь вам нужно только дать указание генератору прокси-сервера использовать этот базовый класс для прокси интерфейса, а не по умолчанию.
var o = new ProxyGenerationOptions();
o.BaseTypeForInterfaceProxy = typeof(ProxyBase);
IDummy firstProxy = g.CreateInterfaceProxyWithTarget(first, o);
IDummy secondProxy = g.CreateInterfaceProxyWithTarget(second, o);