Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建列表<;T>;从手动引用的DLL中的类实例?_C#_Asp.net Mvc_Class_Reflection - Fatal编程技术网

C# 如何创建列表<;T>;从手动引用的DLL中的类实例?

C# 如何创建列表<;T>;从手动引用的DLL中的类实例?,c#,asp.net-mvc,class,reflection,C#,Asp.net Mvc,Class,Reflection,我有一个ASP.NETMVC应用程序 我有一个名为example的示例类 public class Example { public int Id { get; set; } public string Property1{ get; set; } public string Property2{ get; set; } } 我还有一个测试方法-TestingCallFromSeparateConsoleApp,它执行一些功能并返回示例列表 public List&l

我有一个ASP.NETMVC应用程序

我有一个名为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;
}
这将获得示例类的详细信息,但我仍然无法确定如何实际实例化和使用“Example”类型的类

在我的控制台中,我基本上如何说:

ExampleClass newExampleClass = new ExampleClass();
因此,我可以说:

var result = smsAppInstance.GetType().GetMethod("TestingCallFromSeparateConsoleApp").Invoke(smsAppInstance, argumentsTopass);
其中结果可以强制转换到
列表

编辑1

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

Right click project -> Add -> Reference 
如果它是解决方案中的项目,请选择project,或按browse并选择DLL

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

或者,如果您真的想要,请使用dynamic。或者,不幸的是,你必须一路反思。如果你选择接受,这就是你的使命

问题是,您不能在运行时强制转换为
类型
,也不能在编译时使用它

更新


我之所以要这样做是因为如果我引用dll 然后通过VisualStudio运行控制台应用程序,它工作正常,但是如果 运行控制台应用程序的exe,它会引发未处理的异常: 无法加载文件或程序集“EngineeringAssistantMVC”,因此我 我认为手动加载dll会起作用

确保您的bitness是正确的,同时确保您已经引用了
EngineeringAssistantMVC.dll
以及它所依赖的任何其他dll

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

也就是说,您仍然可以声明一些变量,这些变量可以保存对手动加载的对象实例的引用。最明显的是
对象
。在您的例子中,您还可以声明一个
IEnumerable
,由于协方差,它应该可以工作。除此之外,编译器不知道可以在代码中编写的类型

如果你有一个
IEnumerable
,你只能迭代它。您将无法以正常方式访问ExampleClass的任何属性或方法。你必须使用反射

替代方案 处理这种情况的一种常见方法是

  • 创建仅包含接口的第三个程序集,例如,
    IExampleClass

  • 实现
    ExampleClass
    的程序集引用了第三个程序集

  • ExampleClass声明为
    class ExampleClass:IExampleClass

  • 控制台应用程序还引用了第三个程序集

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


  • 所以。。。您可以选择反射或接口。

    只要在控制台项目中引用Dll,就可以了,wallah。。所有这些都是事实。如果您知道类型的名称,就没有理由使用反射来加载它。只是实例化一下。您是否正在尝试创建一个插件架构?已经有几个插件库和框架。DI容器也提供类似的功能,当它们不能完全消除需要时。它本身不是一个插件系统,但是的,我正在手动引用dll文件。顺便说一句,你不需要反射。如果你使用ASP.NET MVC(核心或非核心),你可能已经使用依赖注入。在DLL中添加配置代码,以使用DLL的类、服务配置DI容器。您能给我指一些关于如何执行此操作的文档吗?我是手动加载DLL,而不是通过引用加载的。@Neill为什么?你想解决的实际问题是什么?如果您在编译时知道完整的类型名,为什么不添加引用呢?我之所以要这样做,是因为如果我引用dll,然后通过Visual Studio运行控制台应用程序,它可以正常工作,但是如果我运行控制台应用程序的exe,它会引发一个未处理的异常:无法加载文件或程序集“EngineeringAssistantMVC”,所以我认为手动加载dll是可行的。
    Right click project -> Add -> Reference