2015-05-02 42 views
12

這很容易在舊的.NET中獲得所有可用的類型(例如某些接口),但我無法在新的CoreCLR中找到如何實現這一點的方式。在CoreCLR中獲取可用類型

我想要做的就是像GetRepository這樣的函數,它應該查找IRepository的現有實現並返回該類型的新實例。實施將位於不同的項目中。

所以,在.NET我可以使用這樣的事情:

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 

我有CoreCLR現在唯一的解決辦法是:

public T GetRepository<T>() 
{ 
    foreach (Type type in typeof(T).GetTypeInfo().Assembly.GetTypes()) 
    if (typeof(T).IsAssignableFrom(type) && type.GetTypeInfo().IsClass) 
     return (T)Activator.CreateInstance(type); 

    return default(T); 
} 

但它只能如果接口和實現的位於同一個大會(這不是我的情況)。

謝謝!

+1

能否請您在1號線(評論),什麼是coreCLR,我爲什麼需要它寫? (我知道mscorelib是什麼) –

+0

對我來說,最重要的是能夠在任何平臺上(或者在雲中,甚至是自主託管的,沒有web服務器的情況下)運行web應用程序,以便將框架分離爲更新的小包獨立。我認爲這是一場小革命。你可以閱讀更多在asp.net網站。 –

+1

'AppDomain.CurrentDomain.GetAssemblies()'似乎也在CoreCLR中:請參見[here](https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian

回答

9

所以,這裏是來自微軟的答案: https://github.com/dotnet/coreclr/issues/919

總之,有新

Microsoft.Framework.Runtime.LibraryManager 

public IEnumerable<ILibraryInformation> GetLibraries(); 
public IEnumerable<ILibraryInformation> GetReferencingLibraries(string name); 

UPD:出發從RC2使用Microsoft.Extensions.DependencyModel.DependencyContext代替:

DependencyContext.Default.CompileLibraries 
DependencyContext.Default.RuntimeLibraries 
+0

不再工作!請更新您的答案 –

+1

@AkashKava已更新。 –

+0

似乎沒有在新的DependencyContext中替代GetReferencingLibraries(字符串名稱)! – irperez