2016-05-05 11 views
3

Ich habe eine Aktion in ASP.NET MVC4, die eine generische Methode verwendet:C# generische invoke als MVC Action

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() funktioniert wie erwartet, es geht entlang der TestClass auf dem gattungsgemäßen Verfahren und gibt die Ansicht mit dem Modell der entsprechenden Objekte zurück.

Ich möchte einen Schritt weiter gehen und den Klassennamen einfach als Zeichenfolge übergeben, so dass ich für jeden Typ, den ich verwenden möchte, keine spezifische Aktion benötige.

Test2() arbeitet bis zu dem Punkt, wo ich die Ansicht zurückgeben. Ich weiß, dass die invoke funktioniert, wie ich einen Breakpoint in Generic<T> mit dem richtigen Klassentyp traf, aber die Rückkehr von Test2() ist immer noch, was an den Browser zurückgegeben wird.

Wie kann ich die Rückkehr an die generisch aufgerufene Methode ActionResult delegieren?

+2

Ich verstehe nicht, warum Sie nicht einfach zurückgeben (Action) generic.Invoke (null, null) ;? Randnotiz: Seien Sie mit diesem Code unglaublich vorsichtig, weil es möglicherweise eine große Sicherheitslücke darstellt (der Aufrufer kann einen beliebigen Typ instanziieren (möglicherweise auch etwas, das in seinem Konstruktor eine teure oder schädliche Operation ausführt) –

+1

@Paul, warum geben Sie einfach einen Code ein, der könnte der Klassenname sein, dann speichern Sie ein Wörterbuch von Codes zu schreiben, und Instanziciate es auf diese Art. Dann werden Sie auch die Sicherheitsschwäche entfernen –

+0

@AdrianoRepetti Noch neu zu Generika, ich fand gerade diese Lösung selbst direkt nach der Erstellung dieses Beitrags. – Paul

Antwort

2

Es war direkt vor mir (noch neu in Reflexion):

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; 
}