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

c#mvc从字符串name-eval动态创建控制器?,c#,asp.net-mvc,C#,Asp.net Mvc,我想通过一个字符串名创建一个控制器的新实例。在经典ASP中,我会进行评估,但在c#中如何进行评估 例如: 如果我想创建“AccountController”的实例,通常我会写: var Acc = new AccountController(); 现在,如果控制器名称只能作为字符串使用,那么如何实例化该对象 例如 谢谢你的帮助 Frank如果控制器在程序集中,则只需要一个类名,否则需要一个完全限定的名称(命名空间和程序集)。可以使用反射来完成。类似于: Type t = Type.GetTyp

我想通过一个字符串名创建一个控制器的新实例。在经典ASP中,我会进行评估,但在c#中如何进行评估

例如:

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

var Acc = new AccountController();
现在,如果控制器名称只能作为字符串使用,那么如何实例化该对象

例如

谢谢你的帮助


Frank

如果控制器在程序集中,则只需要一个类名,否则需要一个完全限定的名称(命名空间和程序集)。可以使用反射来完成。类似于:

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

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

您可以使用,但需要知道类型的名称和包含它的程序集的名称(或满足其他条件)。这应该不会太难,因为所有控制器都在一个程序集中。不过,我真的很想知道你为什么认为需要这样做。我在MVC中完成了两个相当大的项目,除了单元测试之外,我想不出任何理由需要创建一个控制器。MVC模式提供了很好的功能分离关注点和创建控制器(从字符串开始)闻起来像是模式冲突。

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

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

一个例子

var b=newcontainerbuilder();
b、 注册().As().Named(“AccountController”);
var c=b.Build();
var控制器=c.Resolve(“AccountController”);

这是ASP.NET MVC在引擎盖下根据控制器匹配URL所做的工作。您确定不能将此留给框架本身吗?
Type t = Type.GetType("NameOfController");
var  c = Activator.CreateInstance(t);
var b = new ContainerBuilder();
b.Register<AccountController>().As<IController>().Named("AccountController");
var c = b.Build();

var controller = c.Resolve<IController>("AccountController");