我想通过字符串名称创建一个控制器的新实例.在经典ASP中我会做一个eval,但是如何在c#中做到这一点?
例如:
如果我想创建一个"AccountController"的实例,通常我会写:
var Acc = new AccountController();
Run Code Online (Sandbox Code Playgroud)
现在,如果控制器名称仅作为字符串提供,我该如何实例化该对象?
例如,
var controllerName = "AccountController";
var acc = new eval(controllerName)();
Run Code Online (Sandbox Code Playgroud)
感谢您的任何帮助!
坦率
如果您的控制器在程序集中,您只需要一个类名,否则您需要一个完全限定的名称(命名空间和程序集).你会用反射来做.就像是:
Type t = Type.GetType("NameOfController");
var c = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)
还有其他方法,但都涉及反射(System.Reflection).
IOC容器将允许此功能.注册控制器类型时,只需提供名称即可.然后,您可以通过提供名称从控制器返回完全实例化的对象.
此外,大多数IOC容器允许您根据接口或基类自动注册类型,因此您甚至不需要手动注册所有控制器.
AutoFac中的一个示例
var b = new ContainerBuilder();
b.Register<AccountController>().As<IController>().Named("AccountController");
var c = b.Build();
var controller = c.Resolve<IController>("AccountController");
Run Code Online (Sandbox Code Playgroud)