2016-05-05 2 views
3

У меня есть Действие в 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?

+2

Я не понимаю, почему вы не просто вернуть (ActionResult) generic.Invoke (NULL, NULL) ;? Замечание: будьте невероятно осторожны с таким кодом, потому что это, возможно, большая дыра в безопасности (вызывающий может создавать экземпляр любого типа (потенциально также что-то, выполняющее дорогостоящую или вредную операцию в своем конструкторе). –

+1

@Paul, почему вы просто передаете код, который может быть именем класса, а затем хранить словарь кодов для ввода и запускать его таким образом. Затем вы также удалите недостаток безопасности –

+0

@AdrianoRepetti Все еще новичок в дженериках, я сразу нашел это решение сразу после создания этого сообщения. – Paul

ответ

2

Это было прямо передо мной (все еще ново для отражения):

public ActionResult Test(string className) 
{ 
    MethodInfo method = typeof(ConfigController).GetMethod("Generic"); 
    MethodInfo generic = method.MakeGenericMethod(Type.GetType(className)); 
    ActionResult ret = (ActionResult)generic.Invoke(this, null); 
    return ret; 
} 
Смежные вопросы