2016-07-15 8 views
-1

Ich arbeite an einem Projekt, bei dem System.Web.Helpers.Webgrid als Basisklasse für ein neues Gitter verwendet wird. Ich glaube, dass es Reflektion verwendet, um private Methoden der Basisklasse aufzurufen.C# Reflection - GetMethod

Könnte jemand bitte ....... Im folgenden Code klären, wie GetDefaultColumnsMethod kehrt etwas zu sehen, kann ich davon ausgehen, dass System.Web.Helpers.WebGrid eine Methode hat auf sie "GetDefaultColumns" benannt?

private MethodInfo GetDefaultColumnsMethod 
{ 
    get { return typeof(System.Web.Helpers.WebGrid).GetMethod("GetDefaultColumns", BindingFlags.Instance | BindingFlags.NonPublic); } 
} 

private IEnumerable<WebGridColumn> GetDefaultColumns(IEnumerable<string> exclusions) 
{ 
    return (IEnumerable <WebGridColumn>)GetDefaultColumnsMethod.Invoke((System.Web.Helpers.WebGrid)this, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { exclusions }, null); 
} 
+0

Referenzquelle https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Helpers/WebGrid/WebGrid.cs –

+0

Dies ist in der [Dokumentation] angegeben (https://msdn.microsoft.com/en-us/library/05eey4y9(v=vs.110).aspx). – Default

+0

Wenn Sie die Methode aufrufen möchten, empfehle ich zu testen, ob sie auch * erwartete Parameter * hat –

Antwort

2

Im folgenden Code, da GetDefaultColumnsMethod etwas zurückgibt, kann ich davon ausgehen, dass System.Web.Helpers.WebGrid eine Methode hat drauf "GetDefaultColumns" genannt?

Ja.

  • Type.GetMethod sucht nach der Methode durch seinen Namen
  • BindingFlags.Instance | BindingFlags.NonPublic bedeutet, dass Sie eine Instanz Methode suchen angegeben (im Gegensatz zu einem static ein Gegensatz), die nicht public ist (es mir merken Sie könnte allerdings protected/internal) .
0

Graben tiefer - i hinzugefügt, um den Debug-Code unten und ich habe jetzt eine Liste der Methoden ....

So kann ich jetzt debuggen und sehen, was da ist ..... und mehr der Punkt, was nicht in neueren Versionen der WebGrid-Komponente ist.

Type tt = this.GetType(); 
    Type t = tt.BaseType; 

    PropertyInfo[] props = 
     t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 
    MethodInfo[] mths = t.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);