2016-05-20 6 views
0

私はしばしば私がよく使うクラスと機能を持つ「mini SDK」を開発しています。他のアセンブリからのインターフェイス実装を正しい方法でインスタンシエート

私は他のアセンブリで実装できるいくつかのインターフェイスを作った。

だから、基本的に次のようになります。

// In SDK.dll: 

namespace MySDK 
{ 
    public interface IExample 
    { 
     /* .. */ 
    } 
} 


// In another assembly: 

namespace Example 
{ 
    public class Implementation : MySDK.IExample 
    { 
     /* .. */ 
    } 
} 

これは問題ありません。これは動作しません

// in SDK.dll 

    private IExample GetImplementation(string fileName) 
    { 
     Type implementation = Assembly 
      .LoadFrom(fileName) 
      .GetExportedTypes() 
      .Where(t => 
       t.GetInterface(typeof(IExample).FullName) != null 
       && (t.Attributes & TypeAttributes.Abstract) != TypeAttributes.Abstract) 
      .FirstOrDefault(); 

     if(implementation != null) 
     { 
      return (IExample)Activator.CreateInstance(implementation); 
     } 
     else 
     { 
      return null; 
     } 
    } 

は私がそれを望むもの:私の問題は、SDKには、私は、このインターフェイスの実際の実装を使用したいので、私がやったことはこれです、ですしかし、それは本当に醜いとにかく間違って見えます。

私はこれを行うには正しい/最善の方法か、が良い方法であるかどうかわかりません。

+3

"SDKでこのインターフェースの実際の実装を使用したいのですが"なぜですか?それは後ろに見える。 _other_インターフェイスを使用するアプリケーションで実装が定義されていない場合はどうなりますか? SDKがパラメータやプロパティを持っていれば、他のDLLがインプリメンテーションで_パスすることができるように思えます。 –

+0

さて、なぜあなたはまだこのアプローチを試していないのだろうと思います。私はそれを試してみましょう;) – Stefan

答えて

0

は私がそれに最初の部分を変更します

Type implementation = Assembly 
     .LoadFrom(fileName) 
     .GetExportedTypes() 
     .Where(t => typeof(IExample).IsAssignableFrom(t) && !t.IsAbstract) 
     .FirstOrDefault(); 

しかし、私はあなたのコードで見る大きな問題は、それが実装するクラスはパラメータなしのコンストラクタを持つ場合にのみ動作することです。あなたもそれをテストする必要があります。

次の問題はジェネリック型です。ですから、私はこれを提案します:

Type implementation = Assembly 
     .LoadFrom(fileName) 
     .GetExportedTypes() 
     .Where(t => 
      typeof(IExample).IsAssignableFrom(t) && 
      !t.IsAbstract && 
      !t.IsGenericType && 
      t.GetConstructors(BindingFlags.Public).Any(c => !c.GetParameters().Any()) 
     .FirstOrDefault(); 

しかし、このアプローチではさらに問題があります。

+0

これはまさに私が走っていた問題です。 とにかく、私は 'Dスタンレー'が質問にコメントとして書いたものが私の質問に対する実際の答えだと思います。 – Stefan

+0

はい、@スタンリーは正しいです。この回答は参考にしておきます。 –

関連する問題