簡體   English   中英

如何建立清單 <T> 從手動引用的DLL中的類的實例?

[英]How do I create a List<T> from an instance of a class from a manually referenced DLL?

我有一個ASP.NET MVC應用程序。

我有一個名為Example的示例類

public class Example
{
    public int Id { get; set; }
    public string Property1{ get; set; }
    public string Property2{ get; set; }
} 

我還有一個測試方法-TestingCallFromSeparateConsoleApp,它可以執行某些功能並返回示例列表

public List<Example> TestingCallFromSeparateConsoleApp()
{
    List<Example> exampleList = new List<Example>();

    exampleList.Add(new Example
    {
        Id = 1,
        Property1 = "First",
        Property2 = "First",
    });

    exampleList.Add(new Example
    {
        Id = 2,
        Property1 = "Second",
        Property2 = "Second",
    });

    return exampleList;
}

我有一個單獨的控制台應用程序,它正在手動加載MVC DLL。

我可以調用TestingCallFromSeparateConsoleApp方法,它將結果作為類型對象返回。

我正在嘗試將結果轉換為示例列表的正確類型。

 asm = Assembly.LoadFrom(assemblyFile);
 var smsAppInstance = asm.CreateInstance("EngineeringAssistantMVC.Controllers.TestController", false, BindingFlags.CreateInstance, null, null, null, null);

 var ExampleClass = asm.GetType("EngineeringAssistant.Controllers.Example", true);
 var ec = ExampleClass.GetType();

這獲得了Example類的詳細信息,但我仍然無法弄清楚如何實際實例化和使用類型為“ Example”的類

在控制台中,我基本上該怎么說:

ExampleClass newExampleClass = new ExampleClass();

所以我可以說:

var result = smsAppInstance.GetType().GetMethod("TestingCallFromSeparateConsoleApp").Invoke(smsAppInstance, argumentsTopass);

可以將結果List<ExampleClass>List<ExampleClass>

編輯1

我正在手動加載dll文件,我不想通過引用添加它。

不,你不能真的

實例化對象是一個運行時概念。 變量的聲明是一個編譯時概念。 您可以實例化在運行時加載的對象,但是無法在代碼中聲明一個對象,因為編譯器在編譯時不知道該對象。

話雖如此,您仍然可以聲明一些變量,這些變量可以包含對手動加載的對象實例的引用。 顯而易見的是object 在您的情況下,您還可以聲明IEnumerable<object> ,由於協方差, IEnumerable<object>應該可以工作。 除此之外,沒有可以在代碼中編寫的編譯器已知的類型。

如果您有IEnumerable<object> ,則只能進行遍歷。 您將無法以常規方式訪問ExampleClass的任何屬性或方法。 您必須使用反射。

替代

解決這種情況的一種常見方法是

  1. 創建第三個程序集,僅包含一個接口,例如IExampleClass

  2. 實現ExampleClass的程序集對此第三個程序集具有引用。

  3. 將ExampleClass聲明為class ExampleClass : IExampleClass

  4. 控制台應用程序還引用了該第三程序集。

  5. 現在,在控制台應用程序的代碼中,您可以使用IExampleClass類型說明符聲明對對象的引用,並以這種方式訪問​​所有屬性和方法。

所以...您的選擇是反射或界面。

Right click project -> Add -> Reference 

如果它是您的解決方案中的項目,請選擇項目,或按瀏覽,然后選擇您的DLL。

您會發現名稱空間和類出現在智能感知中,並且可以使用正確的類型正常引用它們

或者,如果您真的想要公正,請使用動態。 否則,您將不得不一路反思。 如果您選擇接受,這就是您的任務

問題是,您不能在運行時強制轉換為Type ,而在編譯時可以使用它。

更新

我之所以要這樣做,是因為如果我引用該dll,然后通過Visual Studio運行控制台應用程序,則可以正常運行,但是,如果運行控制台應用程序的exe,則會引發未處理的異常:無法加載文件或程序集'EngineeringAssistantMVC',所以我認為手動加載dll是可以的。

確保您的正確性,還確保您還引用了EngineeringAssistantMVC.dll及其依賴的任何其他dll。

暫無
暫無

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

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