[英]How do I create Singleton instance for a library referenced from nuget
[英]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的任何屬性或方法。 您必須使用反射。
解決這種情況的一種常見方法是
創建第三個程序集,僅包含一個接口,例如IExampleClass
。
實現ExampleClass
的程序集對此第三個程序集具有引用。
將ExampleClass聲明為class ExampleClass : IExampleClass
控制台應用程序還引用了該第三程序集。
現在,在控制台應用程序的代碼中,您可以使用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.