2016-09-18 7 views
0

私は最近、PostSharpのサポートフォーラムでthis questionを見つけました。この質問はここで聞かれたようには見えないので、私は今それをやるでしょう。PostSharpで汎用/動的インターフェイスを導入

ジェネリックインターフェイスに関するオリジナルの質問がありました。私はそれに興味を持っていますが、私はプロキシの実装を指している間に、単にオブジェクトに対してインターフェースを動的に実装することにも興味があります。

これは私が達成しようとしているものですが、ご覧のとおり、IntroduceInterfaceAttributeIAspectではないため、下のマークされた行にエラーが発生しています。

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

あなたは正しいです@バタビア、あなたのフィードバックに感謝します。私はその質問にもっと力を入れることができた。私はいくつかのコードとより多くの文脈で更新しました。私はまた、以下の私の質問に、私が現在使っているアダプタのパターン(私が信じているもの)を使ってジェネリックインターフェイスの問題を回避するために使っているものに答えました。これらのいずれかのフィードバックは高く評価されます! –

答えて

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)を試してみることもできます。インターフェイスを導入するには、[IntroduceInterface]を使用することをお勧めします。 – AlexD

関連する問題