2009-05-13 15 views

Respuesta

6

Si yo estuviera haciendo me gustaría buscar todos los archivos de la cadena "(este" - la cadena de búsqueda puede variar en función de las opciones de formato

EDITAR: Después de un poco de experimentación, el. siguiendo parece funcionar para mí con alta precisión utilizando "Buscar en archivos" (Ctrl-Shift-F)

  • Buscar cadena: "\(this [A-Za-z]" (sin las comillas, claro) caso
  • partido: sin marcar
  • palabras completas: Desactivada
  • Uso: Las expresiones regulares
  • mira a estos tipos de archivos: "* .cs"
+0

"este" se pasa a menudo como argumento - supongo que lo que se necesita para que coincida con el patrón "(este nombre de tipo", seguido de " , "o") ", y con cualquier cantidad de espacios en blanco en el medio. No es una simple expresión regular (ni siquiera lo intenté ...) –

+0

Sí, pero en mi formateo sería "(esto,", no "(esto", por lo que no coincidiría. – tvanfosson

+0

... excepto cuando es el único argumento, así que tal vez una expresión regular con "(esto [A-Za-z]", aunque solo lo ejecuté en una de mis soluciones y solo encontré 3 ejemplos pasados ​​como argumento y aproximadamente 50 métodos de extensión (lotes) de extensiones HtmlHelper para MVC). – tvanfosson

1

hacer lo que desea comprobar el código fuente (sólo tiene que buscar en los archivos de (this ...) o su programa en ejecución por reflexión (en este caso, esta discusión this puede ayudarlo)?

+0

Sí. No se olvide de espacios en blanco y saltos entre el corchete y 'esto' –

2

Tal vez el código en este artículo acerca de how to find extension methods targeting object podría ser utilizado? Podría, por ejemplo, reescribirse ligeramente y usarlo para volcar todos los métodos de extensión en lugar de solo los que apuntan a object.

1

Búsqueda amplia de texto de la solución con una expresión regular que coincida con su estilo de codificación. Algo así como "(*this +" (se agregó el primer espacio opcional para obtener algunos errores de tolerancia).

5

Me gustaría ver los ensamblados generados mediante el reflejo; iterar a través de los tipos estáticos en busca de métodos 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 para agregar, puede ser cualquier atributo llamado ExtensionAttribute, no debe ser del mismo tipo que el suministrado en System.Code.dll. Esto le permite usar esta característica mientras apunta a .NET 2. – leppie

+0

True; de ​​hecho, I ' he usado varios - en LINQBridge y MiscUtil entre otros ... Lo actualizaré ... –

+1

No necesita ese espacio de nombres tampoco :) Cualquier atributo llamado ExtensionAttribute funcionará. – leppie

Cuestiones relacionadas