我想通过字符串名称创建一个控制器的新实例。在经典ASP中我会做一个eval,但是如何在c#中做到这一点?
例如:
如果我想创建一个“AccountController”的实例,通常我会写:
var Acc = new AccountController();
现在,如果控制器名称仅作为字符串提供,我该如何实例化该对象?
例如
var controllerName = "AccountController";
var acc = new eval(controllerName)();
感谢您的帮助!
谢
答案 0 :(得分:7)
如果您的控制器在程序集中,您只需要一个类名,否则您需要一个完全限定的名称(名称空间和程序集)。你会用反射来做。类似的东西:
Type t = Type.GetType("NameOfController");
var c = Activator.CreateInstance(t);
还有其他方法,但都涉及反思(System.Reflection
)。
答案 1 :(得分:5)
IOC容器将允许此功能。注册控制器类型时,只需提供名称即可。然后,您可以通过提供名称从控制器返回完全实例化的对象。
此外,大多数IOC容器允许您根据接口或基类自动注册类型,因此您甚至不需要手动注册所有控制器。
中的示例var b = new ContainerBuilder();
b.Register<AccountController>().As<IController>().Named("AccountController");
var c = b.Build();
var controller = c.Resolve<IController>("AccountController");
答案 2 :(得分:2)
您可以使用Activator.CreateInstance,但您需要知道类型的名称和包含它的程序集(或满足其他条件)。这不应该太难,因为所有控制器都在一个组件中。我真的很想知道为什么你认为你需要这样做。我在MVC中完成了几个相当大的项目,并且在单元测试之外无法想到我需要创建控制器的任何原因。 MVC模式提供了良好的关注点分离,并创建了一个控制器(从字符串开始,不会少)闻起来像模式违规。