Интерфейсный прокси без наследования атрибутов

При создании прокси интерфейса с использованием 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>();
Другие вопросы по тегам