2017-05-08 46 views
2

使用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添加接口的屬性?

回答

2

您可以使用AttributesToAvoidReplicating避免特定屬性複製:

AttributesToAvoidReplicating.Add<ServiceContractAttribute>(); 
+0

哈,這是一個unbelivably生動的名字!我並不完全滿意它是靜態的,但由於我從不想複製服務契約屬性,所以對我來說這種方法已經足夠好了。非常感謝!您是否碰巧知道是否有另一種細粒度的方式來對每個代理級別的數據進行影響? – poke

+1

@poke,你必須提供你自己的'ProxyBuilder',它在內部使用自己的定製'Generator',它必須提供一個自定義的'InterfaceProxyWithoutTargetGenerator'實現。很尷尬。 – haim770