我試圖製作一個基於模塊的.NET核心應用程序,並且我需要在所有程序集中查找特定類型的所有類。由於每個模塊都將建在自己的項目中。ASP.NET Core在所有程序集中查找所有類的類型
但我看不到/如何在ASP.NET Core中做到這一點?任何指針將不勝感激。
我試圖製作一個基於模塊的.NET核心應用程序,並且我需要在所有程序集中查找特定類型的所有類。由於每個模塊都將建在自己的項目中。ASP.NET Core在所有程序集中查找所有類的類型
但我看不到/如何在ASP.NET Core中做到這一點?任何指針將不勝感激。
要從一個程序集加載所有類,請參閱下面的代碼。在我的情況IProfile
是,我需要搜索
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)))
{
}
}
嗨leen3o,如果您有外部組件或插件,您可以通過組件的列表迭代獲得所有類型的接口。 在下面的代碼「GlobalConfiguration.Modules」握住我的插件
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);
這裏的名單「IBaseDomainEntity」是我的界面我正在尋找。我唯一關心的是效率,我沒有檢查
我認爲你應該得到你想要搜索的所有程序集的集合,而不是通過遍歷程序集來找到可能的類型匹配。
下面的代碼顯示瞭如何獲得可分配的類型。您還可以添加檢查以排除抽象類或檢查某個類型是否實現泛型類型。
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
的類的完全限定名稱。
有幾次他們在dotnet核心中改變它。但我記得,他們還需要它的剃鬚刀編譯器,你可以開始在那裏看。一般來說,我認爲模塊有1個入口點並讓它自己定義它是其他類更好。而不是自動魔術反射。 –