2011-02-08 10 views
5

Sono curioso di sapere se qualcuno ha scritto codice per riflettere in una classe e trovare i suoi metodi obsoleti?Utilizzo di Reflection per trovare la deprecazione

Ive ha frustato un modello T4 per reattivo e vorrebbe che smettesse di generare gestori per eventi deprecati, qualsiasi hacker intelligente là fuori che mi ha già battuto al punch?

+0

Stai utilizzando la riflessione con T4? Questo è [non raccomandato] (http://www.olegsych.com/2007/12/how-to-use-t4-to-generate-decorator-classes/). – Ani

+0

Vuoi dire membri contrassegnati come Obsoleti (è quella parte del framework reattivo?) – RQDQ

+0

Modificato un modello T4 per generare osservabili dai delegati dell'interfaccia utente e raccoglieva gli eventi deprecati, avevo solo bisogno di filtrarli alla generazione. –

risposta

8

Non so se stai chiedendo il framework T4 o no, ma ecco un esempio di riflessione generica per i metodi Obsolete flagged.

class TestClass 
{ 
    public TestClass() 
    { 
     DeprecatedTester.FindDeprecatedMethods(this.GetType()); 
    } 

    [Obsolete("SomeDeprecatedMethod is deprecated, use SomeNewMethod instead.")] 
    public void SomeDeprecatedMethod() { } 

    [Obsolete("YetAnotherDeprecatedMethod is deprecated, use SomeNewMethod instead.")] 
    public void YetAnotherDeprecatedMethod() { } 

    public void SomeNewMethod() { }   
} 

public class DeprecatedTester 
{ 
    public static void FindDeprecatedMethods(Type t) 
    { 
     MethodInfo[] methodInfos = t.GetMethods(); 

     foreach (MethodInfo methodInfo in methodInfos) 
     { 
      object[] attributes = methodInfo.GetCustomAttributes(false); 

      foreach (ObsoleteAttribute attribute in attributes.OfType<ObsoleteAttribute>()) 
      { 
       Console.WriteLine("Found deprecated method: {0} [{1}]", methodInfo.Name, attribute.Message); 
      } 
     } 
    } 
} 
+1

Perfezione, grazie amico. –

+0

prego. – HuseyinUslu

+5

A proposito, GetCustomAttributes() è sovraccarico e può assumere un parametro di tipo. Quindi per verificare se un metodo è deprecato, basta passare 'typeof (ObsoleteAttribute)'. Il correttore che sto usando (per i valori enum) è: 'return obj.GetType(). GetField (obj.ToString()). GetCustomAttributes (typeof (System.ObsoleteAttribute), true) .Length> 0;' – piojo

Problemi correlati