Partager via


Geek Quizz XI: reflection ?

Comment récupérer et afficher les descriptions "Coucou" et "Salut" des méthodes Method1 et Method2 ?
Le code doit être générique quelque soit la nom de la méthode (Method1 ou Method2 ou autre) bien sûr !

 public class Test
{
    [Description("Coucou")]
    public void Method1()
    {
        ShowDescription(?);
    }
    [Description("Salut")]
    public void Method2()
    {
        ShowDescription(?);
    }
    public void ShowDescription(?)
    {
        Console.WriteLine(?);
    }
}

Comments

  • Anonymous
    August 16, 2007
    PingBack from http://msdnrss.thecoderblogs.com/2007/08/17/geek-quizz-xi-reflection-2/

  • Anonymous
    August 16, 2007
    Sinon pour un code faisant totalement sans le nom de la méthode, comme ça : public class Test {  [Description("Coucou")]  public void Method1()  {    ShowDescription(((DescriptionAttribute)(new StackTrace().GetFrame(0).GetMethod().GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description);  }  [Description("Salut")]  public void Method2()  {    ShowDescription(((DescriptionAttribute)(new StackTrace().GetFrame(0).GetMethod().GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description);  }  public void ShowDescription(string description)  {    Console.WriteLine(description);  } }

  • Anonymous
    August 16, 2007
    Ou encore mieux : public class Test {  [Description("Coucou")]  public void Method1()  {    ShowDescription();  }  [Description("Salut")]  public void Method2()  {    ShowDescription();  }  public void ShowDescription()  {    try    {      Console.WriteLine(((DescriptionAttribute)(new StackTrace().GetFrame(1).GetMethod().GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description);    }    catch    {      Console.WriteLine("Pas de description");    }  } }

  • Anonymous
    August 16, 2007
       public class Test    {        [Description("Coucou")]        public void Method1()        {            ShowDescription();        }        [Description("Salut")]        public void Method2()        {            ShowDescription();        }        private void ShowDescription()        {            StackTrace trace = new StackTrace();            StackFrame caller = trace.GetFrames()[1];            MethodBase methodBase = caller.GetMethod();            DescriptionAttribute[] atts = methodBase.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];            if ((atts != null) && (atts.Length > 0))            {                Console.WriteLine(atts[0].Description);            }        }    }

  • Anonymous
    August 17, 2007
    En solution "basique", il y a l'utilisation d'un delegate :    public class Test    {        delegate void AMethod();        [Description("Coucou")]        public void Method1()        {            ShowDescription(new AMethod(Method1));        }        [Description("Salut")]        public void Method2()        {            ShowDescription(new AMethod(Method2));        }        public void ShowDescription(Delegate g)        {            object[] obj = g.Method.GetCustomAttributes(typeof(DescriptionAttribute), false);            Console.WriteLine(obj != null && obj.Length > 0 ? (obj[0] as DescriptionAttribute).Description : "");        }    }

  • Anonymous
    August 17, 2007
    Petit commentaire : methodBase.GetCustomAttributes(typeof(DescriptionAttribute), false) ne renvoit pas un tableau de DescriptionAttribute. C'est quand même vraiment dommage. D'où l'intérêt d'une petite extension method : http://www.codeplex.com/ExtensionMethods

  • Anonymous
    August 17, 2007
    Sinon on peut faire: methodBase.GetCustomAttributes(typeof(DescriptionAttribute), false).OfType<DescriptionAttribute>()

  • Anonymous
    August 17, 2007
    Toutes vos suggestions sont très intéressantes mais je pensais à quelquechose de bien plus court. J'attends encore quelques autres suggestions. Michael, bien que l'idée de passer par un délégué pour récupérer la MethodInfo soit assez smart, je cherche une méthode générique pour récupérer les informations de type or tu utilises Method1 en dur dans ton code. Du coup autant faire directement typeof(Test).GetMethod("Method1").

  • Anonymous
    August 17, 2007
    Ca peut-être mais c'est pas beaucoup plus court : public class Test {  [Description("Coucou")]  public void Method1()  {    ShowDescription(MethodBase.GetCurrentMethod());  }  [Description("Salut")]  public void Method2()  {    ShowDescription(MethodBase.GetCurrentMethod());  }  public void ShowDescription(MethodBase mb)  {    DescriptionAttribute descriptionAttribute = DescriptionAttribute.GetCustomAttribute(mb, typeof(DescriptionAttribute)) as DescriptionAttribute;    Console.WriteLine(descriptionAttribute != null ? descriptionAttribute.Description : "" );  } }

  • Anonymous
    August 17, 2007
       class Program    {        static void Main(string[] args)        {            Test();            Console.ReadLine();        }        [Description("toto")]        public static void Test()        {            GetDescription(MethodInfo.GetCurrentMethod());        }        static void GetDescription(MethodBase mb)        {            Console.WriteLine(((DescriptionAttribute)Attribute.GetCustomAttribute(mb, typeof(DescriptionAttribute))).Description);        }    }

  • Anonymous
    August 17, 2007
           [Description("Coucou")]        public void Method1()        {            MethodInfo mi = DynamicMethod.GetCurrentMethod() as MethodInfo;            ShowDescription(mi);        }        [Description("Salut")]        public void Method2()        {            MethodInfo mi = DynamicMethod.GetCurrentMethod() as MethodInfo;            ShowDescription(mi);        }        public void ShowDescription(MethodInfo mi)        {            DescriptionAttribute da = Attribute.GetCustomAttribute(mi, typeof(DescriptionAttribute)) as DescriptionAttribute;            Console.WriteLine(da.Description);        } J'ai du mal à faire plus court :)) Sébastien Pertus

  • Anonymous
    August 17, 2007
    J'ai l'impression que ma réponse n'est pas passé :-/ je la remet :p    class Program    {        static void Main(string[] args)        {            Test();            Console.ReadLine();        }        [Description("toto")]        public static void Test()        {            GetDescription(MethodInfo.GetCurrentMethod());        }        static void GetDescription(MethodBase mb)        {              // j'ai un peu oublié de gerer les exceptions :p            Console.WriteLine(((DescriptionAttribute)Attribute.GetCustomAttribute(mb, typeof(DescriptionAttribute))).Description);        }    }

  • Anonymous
    August 17, 2007
    Je ne trouve pas ça forcément mieux mais j'essaie :-) public class Test {    [Description("Coucou")]    public void Method1()    {        ShowDescription(MethodBase.GetCurrentMethod());    }    [Description("Salut")]    public void Method2()    {        ShowDescription(MethodBase.GetCurrentMethod());    }    public void ShowDescription(MemberInfo mi)    {        DescriptionAttribute description = Attribute.GetCustomAttribute(mi, typeof(DescriptionAttribute)) as DescriptionAttribute;        if (description != null)            Console.WriteLine(description.Description);    } }

  • Anonymous
    August 17, 2007
    Là tous les points d’interrogation sont alimentés!  Reste à savoir si c’est la plus courte … pour l’utilisation de  linq à la limite inutile, mais bon c’était pour s'habituer aux bonnes habitudes :D Je ne passe pas par StackTrace mais directment par MethodBase et ses static methods ! public class Test    {        [Description("Coucou")]        public void Method1()        {            ShowDescription(MethodBase.GetCurrentMethod());        }        [Description("Salut")]        public void Method2()        {            ShowDescription(MethodBase.GetCurrentMethod());        }        private void ShowDescription(MethodBase mBase)        {            var q = from des in mBase.GetCustomAttributes(typeof(DescriptionAttribute),false)                    select (des as DescriptionAttribute).Description;            Console.WriteLine(q.ToList<string>().Count == 0 ? "Désolé pas de descrption " : q.ToList<string>()[0]);        }    }

  • Anonymous
    August 17, 2007
    Stop stop stop ! C'est bon vous avez tous gagné ! :p En effet j'attendais la solution utilisant MethodInfo.GetCurrentMethod(). Une solution simple d'une méthode étrange qui rappelle la méthode courante. L'utilisation de stacktrace est identique. Mitsu PS: au fait désolé pour les commentaires bloqués mais mon moteur de blog est subitement devenu paranoïaque a tout passé en "Possible spam"..