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