2016-09-18 1 views
0

Ich habe vor kurzem this question auf PostSharp's Support-Forum gefunden. Es sieht nicht so aus, als wäre diese Frage hier gestellt worden, also werde ich das jetzt tun.Einführung Generic/Dynamic Interface mit PostSharp

Die ursprüngliche Frage erkundigte sich nach generischen Schnittstellen. Ich bin daran interessiert, das zu tun, aber ich bin auch daran interessiert, einfach eine Schnittstelle dynamisch auf einem Objekt zu implementieren, während auf eine Proxy-Implementierung verwiesen wird.

Hier ist, was ich versuche zu erreichen, aber wie Sie sehen können, bekomme ich einen Fehler in der markierten Zeile, wie IntroduceInterfaceAttribute ist kein 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. 
     } 
    } 
} 

Ist dies mit PostSharp möglich?

+0

Also was genau ist das Problem, das Sie versuchen zu lösen. Etwas mit Generika oder etwas mit der Implementierung einer Schnittstelle ist ziemlich breit. Bitte zeigen Sie ein Beispiel von dem, was Sie versuchen zu tun und was Sie versuchten – Batavia

+0

für Beispiel ist dies, was Sie versuchen zu tun? Http: //www.postsharp.net/blog/post/PostSharp-Principals-Day14-e28093 -Introducing-Mitglieder-und-Schnittstellen-Teil-1 (erster Link in Google) – Batavia

+0

Sie sind richtig @ Batavia, danke für Ihr Feedback. Ich hätte mich mehr auf die Frage konzentrieren können. Ich habe mit etwas Code und mehr Kontext aktualisiert. Ich habe auch meine Frage unten mit dem beantwortet, was ich zur Zeit verwende, um das generische Schnittstellenproblem zu umgehen, indem ich (was ich glaube) das Adaptermuster benutze. Irgendwelche Rückmeldungen um beide von diesen würden geschätzt werden! –

Antwort

0

Hier ist, wie ich derzeit dieses Problem lösen, aber ich bin definitiv offen für Feedback, wenn es einen besseren Weg gibt. Auch möchte ich überprüfen, dass dies in der Tat the adapter pattern auch verwendet.

[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

Da Sie eine Proxy-Implementierung bereitstellen möchten, könnten Sie auch daran interessiert sein, [CompositionAspect] (http://doc.postsharp.net/t_postsharp_aspects_compositionaspect) auszuprobieren. Beachten Sie, dass [IntroduceInterface] immer noch eine empfohlene Methode für die Einführung von Schnittstellen ist. – AlexD