c#mvc从字符串名称动态创建控制器 - eval?

时间:2009-11-24 13:12:04

标签: c# asp.net-mvc

我想通过字符串名称创建一个控制器的新实例。在经典ASP中我会做一个eval,但是如何在c#中做到这一点?

例如:

如果我想创建一个“AccountController”的实例,通常我会写:

var Acc = new AccountController();

现在,如果控制器名称仅作为字符串提供,我该如何实例化该对象?

例如

var controllerName = "AccountController";

var acc = new eval(controllerName)();

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

如果您的控制器在程序集中,您只需要一个类名,否则您需要一个完全限定的名称(名称空间程序集)。你会用反射来做。类似的东西:

Type t = Type.GetType("NameOfController");
var  c = Activator.CreateInstance(t);

还有其他方法,但都涉及反思(System.Reflection)。

答案 1 :(得分:5)

IOC容器将允许此功能。注册控制器类型时,只需提供名称即可。然后,您可以通过提供名称从控制器返回完全实例化的对象。

此外,大多数IOC容器允许您根据接口或基类自动注册类型,因此您甚至不需要手动注册所有控制器。

AutoFac

中的示例
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模式提供了良好的关注点分离,并创建了一个控制器(从字符串开始,不会少)闻起来像模式违规。