2009-05-13 12 views

risposta

6

se fossi facendo avrei cercare tutti i file per la stringa "(questo" - la stringa di ricerca può variare in base alle opzioni di formattazione

EDIT: Dopo un po 'di sperimentazione, la. seguito sembra funzionare per me con alta precisione utilizzando "Cerca nei file" (Ctrl-shift-F)

  • stringa di ricerca: "\(this [A-Za-z]" (meno le virgolette, ovviamente) caso
  • Partita: deselezionata
  • Partita intera parola: non selezionata
  • Usa: espressioni regolari
  • un'occhiata a questi tipi di file: "* .cs"
+0

"questo" è spesso passata come argomento - Credo che avresti bisogno di abbinare il modello "(questo nome tipo", seguito da " , "o") ", e con qualsiasi quantità di spazio bianco nel mezzo. Non una semplice regex (non l'ho nemmeno provato ...) –

+0

Sì, ma nella mia formattazione sarebbe "(questo,", non "(questo" quindi non corrisponderebbe. – tvanfosson

+0

... tranne quando è l'unico argomento, quindi forse una regex con "(questo [A-Za-z]", anche se l'ho appena eseguito su una delle mie soluzioni e ho trovato solo 3 esempi passati come argomento e 50 o più metodi di estensione (lotti di estensioni HtmlHelper per MVC) – tvanfosson

1

Vuoi solo controllare il codice sorgente (basta cercare (this ... nei file) o il tuo programma in esecuzione per riflessione (in questo caso, questa discussione this può aiutarti)?

+0

Sì. Per non dimenticare di spazi bianchi e di nuova riga tra parentesi e 'questo' –

2

Forse è possibile utilizzare il codice in questo articolo su how to find extension methods targeting object? Potrebbe, ad esempio, essere riscritto leggermente e utilizzarlo per scaricare tutti i metodi di estensione anziché solo quelli con targeting object.

1

Soluzione di ricerca in tutto il testo con un'espressione regolare che corrisponde allo stile di codifica. Qualcosa come "(*this +" (aggiunto il primo spazio opzionale per ottenere qualche tolleranza di errore).

5

Guarderei gli assiemi generati usando la riflessione; scorrere i tipi statici alla ricerca di metodi con [ExtensionAttribute] ...

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

Solo per aggiungere, può essere qualsiasi attributo denominato ExtensionAttribute, non deve essere lo stesso tipo fornito in System.Code.dll. Ciò consente di utilizzare questa funzionalità durante il targeting di .NET 2. – leppie

+0

Vero, anzi, I ' ho usato diversi - in LINQBridge e MiscUtil, tra gli altri ... Lo aggiornerò ... –

+1

Non ha bisogno di quel namespace :) Qualsiasi attributo chiamato ExtensionAttribute funzionerà. – leppie

Problemi correlati