2009-05-13 3 views

Antwort

6

Wenn ich es tat, würde ich alle Dateien für die Zeichenfolge „(diese“ suchen - Ihr Suchbegriff unterscheiden kann auf der Grundlage Ihrer Formatierungsoptionen

EDIT: Nach einem wenig Experimentieren, das. folgende scheint für mich mit hohen Präzision mit "Find in Files" (Ctrl-Shift-F)

  • Suchbegriff zu arbeiten: "\(this [A-Za-z]" (minus Anführungszeichen, natürlich)
  • Spiel Fall: nicht angehakt
  • ganzes Wort: nicht angehakt
  • Gebrauch: Reguläre Ausdrücke
  • Schauen Sie sich diese Dateitypen: „* .cs“
+0

„this“ wird oft als Argument übergeben - ich denke, Sie müssten übereinstimmen „(dieser Typ Name“ Muster, gefolgt von " "oder") "und mit einer beliebigen Menge an Leerzeichen in der Mitte. Nicht eine einfache Regex (ich habe es nicht einmal versucht ...) –

+0

Ja, aber in meiner Formatierung wäre es "(this", nicht "(this") so würde es nicht übereinstimmen. – tvanfosson

+0

... außer wenn es ist das einzige Argument, also vielleicht eine Regex mit "(dies [A-Za-z]", obwohl ich es nur auf einer meiner Lösungen ausgeführt habe und nur 3 Beispiele davon als Argument und 50 oder so Extension-Methoden (Lose von HtmlHelper Erweiterungen für MVC) – tvanfosson

1

Haben Sie nur den Quellcode überprüfen möchten (suchen Sie einfach nach (this ... in den Dateien) oder Ihr laufendes Programm durch Reflexion (in diesem Fall kann diese this Diskussion Ihnen helfen)?

+0

Yep. Nicht zu vergessen whitespace und Zeilenumbrüche zwischen der Klammer und 'this' –

2

Vielleicht könnte der Code in diesem Artikel über how to find extension methods targeting object verwendet werden? Könnte zum Beispiel leicht umgeschrieben werden und es verwenden, um alle Erweiterungs-Methoden zu dumpen, anstatt nur das Targeting object.

1

Lösungsweite Textsuche mit einer Regex, die zu Ihrem Codierungsstil passt. Etwas wie "(*this +" (hinzugefügt den ersten optionalen Speicherplatz, um eine gewisse Toleranz zu bekommen).

5

Ich würde die generierten Baugruppen mit Reflektion betrachten; durch die statischen Typen iterieren für Methoden mit [ExtensionAttribute] ... suchen

static void ShowExtensionMethods(Assembly assembly) 
{ 
    foreach (Type type in assembly.GetTypes()) 
    { 
     if (type.IsClass && !type.IsGenericTypeDefinition 
      && type.BaseType == typeof(object) 
      && type.GetConstructors().Length == 0) 
     { 
      foreach (MethodInfo method in type.GetMethods(
       BindingFlags.Static | 
       BindingFlags.Public | BindingFlags.NonPublic)) 
      { 
       ParameterInfo[] args; 

       if ((args = method.GetParameters()).Length > 0 && 
        HasAttribute(method, 
         "System.Runtime.CompilerServices.ExtensionAttribute")) 
       { 
        Console.WriteLine(type.FullName + "." + method.Name); 
        Console.WriteLine("\tthis " + args[0].ParameterType.Name 
         + " " + args[0].Name); 
        for (int i = 1; i < args.Length; i++) 
        { 
         Console.WriteLine("\t" + args[i].ParameterType.Name 
          + " " + args[i].Name); 
        } 
       } 
      } 
     } 
    } 
} 
static bool HasAttribute(MethodInfo method, string fullName) 
{ 
    foreach(Attribute attrib in method.GetCustomAttributes(false)) 
    { 
     if (attrib.GetType().FullName == fullName) return true; 
    } 
    return false; 
} 
+0

Nur hinzufügen, es kann ein beliebiges Attribut mit dem Namen ExtensionAttribute sein, es muss nicht der gleiche Typ wie in System.Code.dll sein, damit können Sie diese Funktion beim Targeting von .NET 2 verwenden. – leppie

+0

Wahr, in der Tat, ich ' ve benutzt mehrere - in LINQBridge und MiscUtil unter anderem ... Ich werde es aktualisieren ... –

+1

Es benötigt auch nicht diesen Namespace :) Jedes Attribut namens ExtensionAttribute wird funktionieren. – leppie

Verwandte Themen