如何从手动引用的DLL中创建类的实例List <t>?

时间:2018-05-24 08:13:18

标签: c# asp.net-mvc class reflection

我有一个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方法,并将结果作为类型对象返回。

我正在尝试将结果转换为正确类型的List of Example。

 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>

编辑1

我手动加载dll文件,我不想通过引用添加它。

2 个答案:

答案 0 :(得分:1)

不,你不能

实例化对象是一个运行时概念。变量声明是编译时的概念。您可以实例化在运行时加载的对象,但不能在代码中声明一个对象,因为在编译时编译器不知道它。

话虽如此,您仍然可以声明一些可以保存对手动加载的对象实例的引用的变量。显而易见的是object。在您的情况下,您还可以声明一个IEnumerable<object>,它应该由于协方差而起作用。除此之外,编译器不知道您可以在代码中编写类型。

如果你有一个IEnumerable<object>,那么你做的不仅仅是迭代它。您无法访问任何ExampleClass&#39;属性或方法是正常的方式。你必须使用反射。

替代

处理这种情况的常用方法是

  1. 创建第三个程序集,仅包含一个接口,例如IExampleClass

  2. 实现ExampleClass的程序集引用了第三个程序集。

  3. ExampleClass声明为class ExampleClass : IExampleClass

  4. 控制台应用程序还引用了第三个程序集。

  5. 在控制台应用程序的代码中,您现在可以声明对类型说明符为IExampleClass的对象的引用,并以这种方式访问​​所有属性和方法。

  6. 所以...你的选择是反思或界面。

答案 1 :(得分:0)

Right click project -> Add -> Reference 

如果您的解决方案中有项目,请选择项目,或按浏览并选择您的DLL。

您会发现名称空间和类在intellisense中出现,您可以使用正确的类型正常引用它们

或者,如果你真的想要,请使用动态。或者你不得不一直反映一路。如果您选择接受它,这是您的使命

问题是,您是否无法在运行时转换为Type,并在编译时使用它。

<强>更新

  

我想这样做的原因是因为我引用了dll和   然后通过Visual Studio运行控制台应用程序它工作正常,但如果我   运行控制台应用程序的exe,它会抛出一个未处理的异常:   无法加载文件或程序集'EngineeringAssistantMVC',所以我   想手动加载DLL会起作用。

确保你的位数是正确的,同时确保你引用了EngineeringAssistantMVC.dll以及它所依赖的任何其他dll ..