2017-03-01 8 views
2

モジュールベースの.NETコアアプリケーションを作成しようとしています。すべてのアセンブリで特定のタイプのすべてのクラスを見つける必要があります。各モジュールはそれ自身のプロジェクトに組み込まれます。ASP.NETコアすべてのアセンブリですべてのクラスタイプを検索

しかし、私は見ることができない/ ASP.NETコアでそれを行う方法を見つけることができますか?任意のポインタが評価されるだろう。

+0

数回、ドットネットのコアを変更しました。しかし、私は覚えている、彼らはまた、あなたがそこに見ることができる剃刀のコンパイラのためにそれを必要とした。一般的には、モジュールが1つのエントリポイントを持ち、それ自体が他のクラスを定義できるようにする方が良いと思います。自動マジックリフレクションの代わりに。 –

答えて

3

1つのアセンブリからすべてのクラスをロードするには、次のコードを参照してください。私の場合はIProfileは私がこんにちはleen3o

var all = Assembly 
     .GetEntryAssembly() 
     .GetReferencedAssemblies() 
     .Select(Assembly.Load) 
     .SelectMany(x => x.DefinedTypes) 
     .Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));  

foreach (var ti in all) 
{ 
    var t = ti.AsType(); 
    if (t.Equals(typeof(IProfile))) 
    { 

    } 
} 

を検索する必要があるインターフェイスである、あなたは、外部アセンブリまたはプラグインを持っている場合、あなたは、アセンブリのリストから繰り返すことで、すべてのタイプを取得することができます。コード「GlobalConfiguration.Modules」以下で は「IBaseDomainEntity」ここにプラグイン

List<Type> typeToRegisters = new List<Type>(); 
    foreach (var module in GlobalConfiguration.Modules) 
    { 
    typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t => t.AsType())); 
      }  

    var entity-types = typeToRegisters.Where(x => x.GetTypeInfo().IsSubclassOf(typeof(IBaseDomainEntity)) && !x.GetTypeInfo().IsAbstract); 

の私のリストを保持している私が探しています私のインタフェースです。私がここで懸念しているのは、チェックしていない効率です。

+0

ありがとう。しかし、私が間違っていない限り、これは実行中のアセンブリーと参照されているアセンブリーを実行中のアセンブリーからのみ取得します。残念ながら、実行アセンブリによって参照されていなくても、すべてのアセンブリを検索/取得する必要があります。誰かがウェブサイトにプラグインdllを置くことができ、ウェブサイトはそれについて何も知らないだろう。 – leen3o

+1

こんにちは[leen3o](https://stackoverflow.com/users/82197/leen3o)、私は編集された投稿があなたの答えを与えるはずです – Aamir

1

検索したいすべてのアセンブリのコレクションを取得する必要があります。可能性のある型の一致を見つけるためにアセンブリをループすることができます。

以下のコードは、割り当て可能なタイプを取得する方法を示しています。チェックを追加して抽象クラスを除外したり、型がジェネリック型を実装しているかどうかをチェックすることもできます。私はおそらくこれを達成する方法を見つけた

foreach (var assembly in _assemblies) 
{ 
    foreach (var candidate in assembly.ExportedTypes.Select(t => t.GetTypeInfo())) 
    { 
     if (assignTypeFrom.GetTypeInfo().IsAssignableFrom(candidate) && candidate.IsClass) 
     { 
      yield return candidate.AsType(); 
     } 
    } 
} 
3

var all = 
     Assembly 
     .GetEntryAssembly() 
     .GetReferencedAssemblies() 
     .Select(Assembly.Load) 
     .SelectMany(x => x.DefinedTypes) 
     .Where(type => typeof(ICloudProvider).IsAssignableFrom(type.AsType())); 
foreach (var ti in all) 
{ 
    var t = ti.AsType(); 
    if (!t.Equals(typeof(ICloudProvider))) 
    { 
     // do work 
    } 
} 

私はAssembly.Load一部の費用が心配ですが、これはおそらく私の仕事は今のために行われます - 私は唯一の必要があるとして、完全修飾名ICloudProviderを実装するすべてのクラスの名前。

関連する問題