У меня есть Действие в ASP.NET MVC4, который использует общий метод:C# использовать общие задействуют, MVC ActionResult
public ActionResult Test1()
{
return Generic<TestClass>();
}
public ActionResult Test2(string className)
{
MethodInfo method = typeof(ConfigController).GetMethod("Generic");
MethodInfo generic = method.MakeGenericMethod(Type.GetType(className));
generic.Invoke(this, null);
return null; // Generic<TestClass>();
}
public ActionResult Generic<T>() where T : new()
{
DatabaseUtil db = new DatabaseUtil();
ViewBag.ClassName = typeof(T).AssemblyQualifiedName;
return View("~/Views/Config/GenericConfig.cshtml", db.SelectAll<T>());
}
Test1() работает так же, как и ожидался, она проходит вдоль TestClass
родовой методы и возвращает представление, используя модель соответствующих объектов.
Я хочу сделать этот шаг дальше и просто передать имя класса в виде строки, так что мне не нужно определенное действие для каждого типа, который я хочу использовать.
Test2() работает до той точки, где я возвращаю представление. Я знаю, что работает invoke
, так как я ударил точку останова в Generic<T>
с правильным типом класса, но возврат из Test2() все еще передан в браузер.
Как я могу делегировать возврат к общему методу ActionResult
?
Я не понимаю, почему вы не просто вернуть (ActionResult) generic.Invoke (NULL, NULL) ;? Замечание: будьте невероятно осторожны с таким кодом, потому что это, возможно, большая дыра в безопасности (вызывающий может создавать экземпляр любого типа (потенциально также что-то, выполняющее дорогостоящую или вредную операцию в своем конструкторе). –
@Paul, почему вы просто передаете код, который может быть именем класса, а затем хранить словарь кодов для ввода и запускать его таким образом. Затем вы также удалите недостаток безопасности –
@AdrianoRepetti Все еще новичок в дженериках, я сразу нашел это решение сразу после создания этого сообщения. – Paul