Интерфейсный прокси без наследования атрибутов
При создании прокси интерфейса с использованием 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 от добавления атрибутов интерфейса?
1 ответ
Ты можешь использовать AttributesToAvoidReplicating
чтобы избежать репликации определенных атрибутов:
AttributesToAvoidReplicating.Add<ServiceContractAttribute>();