2009-11-24 86 views
3

我想創建一個控制器的新實例,通過一個字符串名稱。在經典的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

回答

7

如果你的控制器,你只需要一個類名組件內,否則,你需要一個完全合格的名稱空間(namespace 組裝)。你會使用反射來做到這一點。例如:

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

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

2

您可以使用Activator.CreateInstance但您需要知道類型的名稱和包含它的程序集的名稱(或滿足其他條件)。這應該不會太難,因爲所有的控制器都在一個組件中。不過,我真的很想知道爲什麼你認爲你需要這樣做。我在MVC中完成了幾個相當大的項目,除了單元測試之外我無法想出任何需要創建控制器的原因。 MVC模式提供了良好的問題分離,並且創建了一個控制器(從字符串中,不會少於),就像模式違規一樣。

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");