2016-09-18 2 views
0

Недавно я нашел this question на форуме поддержки PostSharp. Не похоже, чтобы этот вопрос задавали здесь, поэтому я сделаю это сейчас.Ввести общий/динамический интерфейс с PostSharp

Оригинальный вопрос поинтересовался общими интерфейсами. Я заинтересован в этом, но мне также интересно просто динамически реализовать интерфейс для объекта, указав на реализацию прокси.

Вот что я пытаюсь выполнить, но, как вы можете видеть, я получаю сообщение об ошибке на отмеченной строке ниже, так как IntroduceInterfaceAttribute не является IAspect.

public class ApplyInterfaces : TypeLevelAspect, IAspectProvider 
{ 
    readonly Type[] interfaceTypes; 
    public ApplyInterfaces(params Type[] interfaceTypes) 
    { 
     this.interfaceTypes = interfaceTypes; 
    } 

    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     var type = (Type)targetElement; 
     var targetTypes = InterfaceTypeProvider.GetInterfacesFor(type); // pseudo-code. Get interfaces to implement "somewhere". 

     foreach (var interfaceType in interfaceTypes.Concat(targetTypes)) 
     { 
      yield return new AspectInstance(type, new IntroduceInterfaceAttribute(interfaceType)); // doesn't work. 
     } 
    } 
} 

Возможно ли это с помощью PostSharp?

+0

Так в чем же проблема, которую вы пытаетесь решить. Что-то с дженериками или чем-то с реализацией интерфейса довольно обширно. Пожалуйста, покажите пример того, что вы пытаетесь сделать и что вы пробовали – Batavia

+0

для axample - это то, что вы пытаетесь сделать? Http: //www.postsharp.net/blog/post/PostSharp-Principals-Day-14-e28093 -Интегрирование-членов-и-интерфейсов-Часть-1 (первая ссылка в google) – Batavia

+0

Вы правильно @Batavia, спасибо за ваши отзывы. Я мог бы приложить больше усилий в этом вопросе. Я обновил код и больше контекста. Я также ответил на мой вопрос ниже тем, что я сейчас использую для работы с проблемой общего интерфейса, используя (что я считаю) шаблон адаптера. Любая обратная связь вокруг любого из них была бы оценена! –

ответ

0

Вот как я в настоящее время решаю эту проблему, но я определенно открыт для обратной связи, если есть лучший способ. Кроме того, я хотел бы проверить, что это действительно использует the adapter pattern.

[IntroduceInterface(typeof(IGenericInterface))] 
public class DynamicInterfaceAspect : InstanceLevelAspect, IGenericInterface 
{ 
    readonly Type parameterType; 

    public DynamicInterfaceAspect(Type parameterType) 
    { 
     this.parameterType = parameterType; 
    } 

    public override void RuntimeInitializeInstance() 
    { 
     var type = typeof(GenericInterfaceAdapter<>).MakeGenericType(parameterType); 
     Inner = (IGenericInterface)Activator.CreateInstance(type, Instance); 
    } 

    IGenericInterface Inner { get; set; } 
    public void HelloWorld(object parameter) => Inner.HelloWorld(parameter); 
} 

public interface IGenericInterface 
{ 
    void HelloWorld(object parameter); 
} 

public class GenericInterfaceAdapter<T> : IGenericInterface 
{ 
    readonly IGenericInterface<T> inner; 

    public GenericInterfaceAdapter(IGenericInterface<T> inner) 
    { 
     this.inner = inner; 
    } 

    public void HelloWorld(object parameter) => inner.HelloWorld((T)parameter); 
} 

public interface IGenericInterface<in T> 
{ 
    void HelloWorld(T parameter); 
} 
+0

Поскольку вы хотите обеспечить реализацию прокси-сервера, вам также может быть интересно попробовать [CompositionAspect] (http://doc.postsharp.net/t_postsharp_aspects_compositionaspect). Обратите внимание, что [IntroductionceInterface] по-прежнему является рекомендуемым способом введения интерфейсов. – AlexD

Смежные вопросы