簡體   English   中英

如何通過反射從引用的程序集中獲取類型

[英]How can I get a type from a referenced assembly via reflection

假設我有一個工廠方法,該方法想構造一個在運行時通過反射選擇的類型的實例。 進一步假設我的工廠方法是通用代碼,盡管它將在引用了必需程序集的應用程序中運行,但它不直接引用包含指定類型的程序集。

我該如何編寫可以找到這種類型的代碼? 如果我執行以下操作

public object CreateInstance(string typeName)
{
    Type desiredType = Assembly.GetExecutingAssembly().GetType(typename);

    // Instantiate the type...
}

這似乎失敗了,因為在執行的程序集中未定義類型。 如果我可以在運行時獲得所有可用的程序集,則可以對其進行迭代並找到包含所需類型的程序集。 但是我看不到這樣做的方法。 AppDomain.CurrentDomain.GetAssemblies()看起來很有希望,但不會返回我在項目中引用的所有程序集。

編輯 :幾個人指出我需要加載程序集。 麻煩的是,這段代碼不知道應該加載哪個程序集,因為我試圖以不依賴於其他程序集的方式編寫此代碼。

我故意省略了typeName的詳細信息,因為從字符串到類型的映射實際上在我的實際代碼中更加復雜。 實際上,類型是由包含指定字符串的自定義屬性標識的,但是如果我可以保留類型列表,則將列表限制為所需類型沒有問題。

您可以使用GetReferencedAssemblies並遍歷所有類型,直到找到所需的類型。

var t = Assembly
   .GetExecutingAssembly()
   .GetReferencedAssemblies()
   .Select(x => Assembly.Load(x))
   .SelectMany(x => x.GetTypes()).First(x => x.FullName == typeName);

盡管它可能不是性能最高的。 再一次,您正在使用反射。

調用AppDomain.CurrentDomain.GetAssemblies()僅返回當前加載到AppDomain的DLL集。 DLL按需加載到CLR進程中; 因此,在實際使用一個DLL之前,它不會包含項目中引用的所有DLL。

但是,您可以做的是通過使用typeof表達式將程序集強制進入流程。 例如

var force1 = typeof(SomeTypeInTheProject).Assembly;
var force2 = typeof(SomeTypeInProject2).Assembly;

AppDomain.CurrentDomain.GetAssemblies()僅返回已加載的程序集。 因此,如果尚未加載該引用的程序集,則需要加載它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM