use*_*252 6 c# reflection ioc-container unity-container
我正在尝试使用以下代码创建类的实例(在运行时通过字符串):
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName); //throws MissingMethodException
Type classType = instance.GetType();
Run Code Online (Sandbox Code Playgroud)
但是,我试图实例化的类在构造函数中有两个参数,由Unity IoC容器解析.
当我执行上面的代码时,它会抛出'System.MissingMethodException'.
我在网上搜索过,看起来Assembly.CreateInstance将无法解析Unity依赖注入.
这是一个死胡同还是有一种方法可以使用"CreateInstance"方法实例化该类并解析Unity依赖关系?
CreateInstance 可以接收参数,您可以使用 ctor 参数以这种方式调用它:
(T)Activator.CreateInstance(typeof(T), param1, param2);
Run Code Online (Sandbox Code Playgroud)
Activator.CreateInstance 不知道您的应用程序中有 IOC 模块。它只是创建一个类型的实例。
现在你有两个选择:
1.使用您的 IOC 管理器在没有激活器的情况下创建实例- 在我看来,这似乎是正确的做事方式,而且可能是您正在寻找的。您的 IOC 管理器(Unity)在注入所有依赖项时解析类型。
var instance = UnityManager.Resolve(typeName); // UnityManager is a manager that holds your unity container.
Run Code Online (Sandbox Code Playgroud)
2.使用Unity获取ctor参数并创建没有注入的实例(激活器+简单的参数传递)。你可能不想这样做。我已将此添加为另一个解释示例。
var param1 = UnityManager.Resolve(typeOfParam1);
var param2 = UnityManager.Resolve(typeOfParam2);
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName, param1,param2);
Run Code Online (Sandbox Code Playgroud)
小智 -4
死路。Unity 不是 .NET 框架核心的一部分。您如何期望激活器(CreateInstance)神奇地知道这一点并调用统一方法来解决问题?
决不。