2017-03-01 126 views
2

我試圖製作一個基於模塊的.NET核心應用程序,並且我需要在所有程序集中查找特定類型的所有類。由於每個模塊都將建在自己的項目中。ASP.NET Core在所有程序集中查找所有類的類型

但我看不到/如何在ASP.NET Core中做到這一點?任何指針將不勝感激。

+0

有幾次他們在dotnet核心中改變它。但我記得,他們還需要它的剃鬚刀編譯器,你可以開始在那裏看。一般來說,我認爲模塊有1個入口點並讓它自己定義它是其他類更好。而不是自動魔術反射。 –

回答

3

要從一個程序集加載所有類,請參閱下面的代碼。在我的情況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」是我的界面我正在尋找。我唯一關心的是效率,我沒有檢查

+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的類的完全限定名稱。

相關問題