我试图使用以下代码创建一个类的实例(在运行时通过字符串):
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName); //throws MissingMethodException
Type classType = instance.GetType();
但是,我试图实例化的类在构造函数中有两个参数,这是由Unity IoC容器解决的。
当我执行上面的代码时,它抛出'System.MissingMethodException'。
我已经在网上搜索了,它似乎是组装。创建实例将无法解析Unity依赖注入。
这是一个死胡同还是有一种方法,我可以实例化类使用"CreateInstance"方法和解决Unity依赖关系?
CreateInstance可以接收参数,你可以这样调用它:
(T)Activator.CreateInstance(typeof(T), param1, param2);
活化剂。CreateInstance不知道您的应用程序中有IOC模块。它只是创建一个类型的实例。
现在你有两个选择:
1。使用您的IOC管理器创建没有激活器的实例—在我看来,这是正确的做事方式,可能也是您正在寻找的。你的IOC管理器(Unity)在注入所有依赖的同时解析类型。
var instance = UnityManager.Resolve(typeName); // UnityManager is a manager that holds your unity container.
2。使用Unity获取参数并创建实例,而不需要注入(Activator +简单的参数传递)。你可能不想这么做。我添加了这个作为另一个解释性示例。
var param1 = UnityManager.Resolve(typeOfParam1);
var param2 = UnityManager.Resolve(typeOfParam2);
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName, param1,param2);
你有两个选择
1)向Unity请求类的实例。Unity必须解决构造函数参数的依赖关系。你并不在乎,因为Unity有责任提供给你一个实例。然而,我猜出于某种原因,Unity没有初始化或不可用。
2)对于"typeName",选择一个合适的构造函数,查看依赖项,自己实例化依赖项(或要求Unity给你依赖项的实例),然后调用构造函数传递每个依赖项的实例。
在许多依赖注入机制中,依赖是自上而下提供的,并且据我所知,在类型的构造函数中包含对"container.Inject(this)"的调用是不正常的。这样的类型将与容器实现耦合,减少依赖关系是IOC的全部内容之一。
我猜"typeName"必须没有默认构造函数(MissingMethodException)。
或者您可以将参数注入到想要创建实例的类中。然后像这样
var assembly = Assembly.GetAssembly(assemblyType);
var type = assembly.GetType(typeName);
var instance = Activator.CreateInstance(type, parameter1, parameter2);
如果你有统一的静态属性,你可以这样做:
Assembly assembly = Assembly.GetAssembly(typeAssembly);
//get the type
Type classType = assembly.GetType(typeName);
//using a static property
var instance = YourApp.Unity.Resolve(classType);
死胡同。Unity并不是。net框架核心的一部分。您如何期望激活器(CreateInstance)神奇地知道并调用unity方法来解决问题?
不可能。