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

问题描述:

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

如:

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

var Acc = new AccountController(); 

现在,如果控制器名称仅作为一个字符串,我怎么可能实例化对象?

例如,

var controllerName = "AccountController"; 

var acc = new eval(controllerName)(); 

谢谢你的任何帮帮我!

弗兰克

+0

这是ASP.NET MVC的罩来匹配控制器的URL下一样。你确定你不能把它留给框架本身吗? – bzlm 2009-11-24 13:16:39

如果你的控制器,你只需要一个类名组件内,否则,你需要一个完全合格的名称空间(namespace 组装)。你会使用反射来做到这一点。例如:

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

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

您可以使用Activator.CreateInstance但您需要知道类型的名称和包含它的程序集的名称(或满足其他条件)。这应该不会太难,因为所有的控制器都在一个组件中。不过,我真的很想知道为什么你认为你需要这样做。我在MVC中完成了几个相当大的项目,除了单元测试之外我无法想出任何需要创建控制器的原因。 MVC模式提供了良好的问题分离,并且创建了一个控制器(从字符串中,不会少于),就像模式违规一样。

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

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

一个例子AutoFac

var b = new ContainerBuilder(); 
b.Register<AccountController>().As<IController>().Named("AccountController"); 
var c = b.Build(); 

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