Come posso trovare tutti i metodi di estensione in soluzione?Come posso trovare tutti i metodi di estensione in soluzione?
risposta
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"
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)?
Sì. Per non dimenticare di spazi bianchi e di nuova riga tra parentesi e 'questo' –
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
.
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).
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;
}
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
Vero, anzi, I ' ho usato diversi - in LINQBridge e MiscUtil, tra gli altri ... Lo aggiornerò ... –
Non ha bisogno di quel namespace :) Qualsiasi attributo chiamato ExtensionAttribute funzionerà. – leppie
- 1. Come eseguire tutti i test in soluzione
- 2. I metodi LINQ sono metodi di estensione?
- 3. Come vengono compilati i metodi di estensione?
- 4. Come posso ottenere tutti i metodi in un protocollo?
- 5. Estensione di Protobuf con i miei metodi
- 6. Intellisense per i metodi di estensione?
- 7. Come posso trovare i metodi Python senza istruzioni di ritorno?
- 8. I metodi di estensione nascondono le dipendenze?
- 9. Aggiungi eventi utilizzando i metodi di estensione
- 10. Come posso trovare tutti i prodotti senza immagini in Magento?
- 11. Come posso trovare tutti i file estratti in TFS 2010?
- 12. Resharper Converti foreach in LINQ utilizzando i metodi di estensione
- 13. Metodi di estensione in Python
- 14. Come trovare tutti i metodi non utilizzati di una classe in PyCharm?
- 15. metodi di estensione statici
- 16. Metodi di estensione in T4
- 17. Concatenamento di metodi di estensione in C#
- 18. Come organizzare i metodi di estensione di Kotlin
- 19. Metodi di estensione virtuale?
- 20. Come definire i metodi di estensione per la classe generica?
- 21. Come trovare tutti i costruttori statici?
- 22. Come posso comunicare a MSTEST di eseguire tutti i progetti di test in una soluzione?
- 23. Come trovare tutti i valori hardcoded in un progetto C# (soluzione)?
- 24. Posso utilizzare i metodi di estensione e LINQ in .NET 2.0 o 3.0?
- 25. Come simulare i metodi di estensione con Rhino Mock?
- 26. Chiamata di metodo ambigua tra i metodi di estensione
- 27. Come aggiungere metodi di estensione per enumerazioni
- 28. C# metodi di estensione ambigui
- 29. Come posso utilizzare ReSharper per elencare i metodi non utilizzati in una soluzione?
- 30. ASP MVC Razor visualizza i metodi di estensione, come creare metodi di visualizzazione 'globali'?
"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 ...) –
Sì, ma nella mia formattazione sarebbe "(questo,", non "(questo" quindi non corrisponderebbe. – tvanfosson
... 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