モジュールベースの.NETコアアプリケーションを作成しようとしています。すべてのアセンブリで特定のタイプのすべてのクラスを見つける必要があります。各モジュールはそれ自身のプロジェクトに組み込まれます。ASP.NETコアすべてのアセンブリですべてのクラスタイプを検索
しかし、私は見ることができない/ ASP.NETコアでそれを行う方法を見つけることができますか?任意のポインタが評価されるだろう。
モジュールベースの.NETコアアプリケーションを作成しようとしています。すべてのアセンブリで特定のタイプのすべてのクラスを見つける必要があります。各モジュールはそれ自身のプロジェクトに組み込まれます。ASP.NETコアすべてのアセンブリですべてのクラスタイプを検索
しかし、私は見ることができない/ ASP.NETコアでそれを行う方法を見つけることができますか?任意のポインタが評価されるだろう。
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);
の私のリストを保持している私が探しています私のインタフェースです。私がここで懸念しているのは、チェックしていない効率です。
検索したいすべてのアセンブリのコレクションを取得する必要があります。可能性のある型の一致を見つけるためにアセンブリをループすることができます。
以下のコードは、割り当て可能なタイプを取得する方法を示しています。チェックを追加して抽象クラスを除外したり、型がジェネリック型を実装しているかどうかをチェックすることもできます。私はおそらくこれを達成する方法を見つけた
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();
}
}
}
、
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
を実装するすべてのクラスの名前。
数回、ドットネットのコアを変更しました。しかし、私は覚えている、彼らはまた、あなたがそこに見ることができる剃刀のコンパイラのためにそれを必要とした。一般的には、モジュールが1つのエントリポイントを持ち、それ自体が他のクラスを定義できるようにする方が良いと思います。自動マジックリフレクションの代わりに。 –