不继承属性的接口代理

Interface proxy without inheriting attributes

使用Castle DynamicProxy创建接口代理时,创建的代理对象似乎总是“继承”接口的属性

一般来说,这不是真正的问题,但就我而言,我使用代理在 运行 时生成 WCF 服务实现。该接口有一个 ServiceContractAttribute,当实现类型(服务 行为 )也有该属性时,WCF 真的不喜欢它。

参见以下示例:

var generator = new ProxyGenerator();

var interceptor = new ExampleInterceptor();
var proxy = generator.CreateInterfaceProxyWithoutTarget(typeof(ITest), interceptor);

proxy.GetType().CustomAttributes.Select(a => a.AttributeType.Name).Dump();
// SerializableAttribute, XmlIncludeAttribute, ServiceContractAttribute 

typeof(Test).CustomAttributes.Select(a => a.AttributeType.Name).Dump();
// (empty)
public class ExampleInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation) { }
}

[ServiceContract]
public interface ITest { }

public class Test : ITest { }

查看代理类型的属性时,我得到以下 三个SerializableAttributeXmlIncludeAttributeServiceContractAttribute。所以 DP 不仅复制了 ServiceContractAttribute,它还添加了两个(我不太关心那些)。如果我将其与我的界面的手动实现进行比较,我没有得到任何类型。

因此 DP 中确实添加了这些属性。有没有办法影响那个属性的生成,阻止 DP 添加接口的属性?

您可以使用 AttributesToAvoidReplicating 来避免特定属性复制:

AttributesToAvoidReplicating.Add<ServiceContractAttribute>();