不继承属性的接口代理
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 { }
查看代理类型的属性时,我得到以下 三个:SerializableAttribute
、XmlIncludeAttribute
和 ServiceContractAttribute
。所以 DP 不仅复制了 ServiceContractAttribute
,它还添加了两个(我不太关心那些)。如果我将其与我的界面的手动实现进行比较,我没有得到任何类型。
因此 DP 中确实添加了这些属性。有没有办法影响那个属性的生成,阻止 DP 添加接口的属性?
您可以使用 AttributesToAvoidReplicating
来避免特定属性复制:
AttributesToAvoidReplicating.Add<ServiceContractAttribute>();
使用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 { }
查看代理类型的属性时,我得到以下 三个:SerializableAttribute
、XmlIncludeAttribute
和 ServiceContractAttribute
。所以 DP 不仅复制了 ServiceContractAttribute
,它还添加了两个(我不太关心那些)。如果我将其与我的界面的手动实现进行比较,我没有得到任何类型。
因此 DP 中确实添加了这些属性。有没有办法影响那个属性的生成,阻止 DP 添加接口的属性?
您可以使用 AttributesToAvoidReplicating
来避免特定属性复制:
AttributesToAvoidReplicating.Add<ServiceContractAttribute>();