Utiliser l’API de Reflection au sein de Silverlight

Aucun commentaire

J'ai dernièrement eu besoin de récupérer toutes les méthodes static d'une classe afin d'afficher le résultat visuel de celles-ci. En fait l'idée était d'afficher la courbe correspondante à chaque équation de mouvement contenues dans la classe TweenedEquations. Pour cela il suffit dans le framework Silverlight d'utiliser l'Api de Reflection contenue dans le package System.Reflection. Je mets ici en ligne la portion du code que j'ai utilisé afin d'automatiser l'instanciation automatisée d'un UserControl (composant) personnalisé.

Voici tout d'abord le code logique du contrôle personnalisé :

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Tweened;
using System.Diagnostics;
 
namespace TweenEquationSlideShow
{
	public partial class TweenedEquationThumb : UserControl
	{
        public Func TweenEquation;
        double EndValue;
        double StartValue;
        double BaseValue;
        Tween showTween = new Tween();
 
        public TweenedEquationThumb(Func tweenEquation, double endValue, double startValue, double baseValue)
        {
                // Required to initialize variables
                InitializeComponent();
                TweenEquation = tweenEquation;
                StartValue = startValue;
                EndValue = endValue;
                BaseValue = baseValue;
                TweenDoubleDescription tdc = new TweenDoubleDescription(animPath,         TweenableProperties.Left, TweenEquation, 2, 180, 20);
                 tdc.Definition = 200;
                showTween.AddSequences(tdc);
                showTween.TweenCompleted += new Tween.StoryboardComplete(showTween_TweenCompleted);
                Loaded += new RoutedEventHandler(TweenedEquationThumb_Loaded);
 
        }
 
        void showTween_TweenCompleted(Tween sender, object freeReference)
        {
            sender.Stop();
        }
 
        void TweenedEquationThumb_Loaded(object sender, RoutedEventArgs e)
        {
            MouseLeftButtonDown += new MouseButtonEventHandler(TweenedEquationThumb_MouseLeftButtonDown);
            DrawCurve();
        }
 
        void TweenedEquationThumb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            showTween.Start();
        }
 
        private void DrawCurve()
        {
 
            double ecart = Math.Round((double)1/200, 3);
            Debug.WriteLine("ecart :: "+ecart);
 
            for (int i = 0; i < 200; i++)
            {
                double currentTime = ecart * i;
                double XTimeValue = currentTime * 180;
                double YValue = BaseValue + (double)Math.Round(this.TweenEquation(currentTime, StartValue, EndValue, 1) * 1000) / 1000;
 
                Ellipse bulle = new Ellipse();
                bulle.Width = 1.2;
                bulle.Height = 1.2;
                bulle.Fill = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0xff, 0xff) );
                Curve.Children.Add(bulle);
                Canvas.SetLeft(bulle, 20+XTimeValue);
                Canvas.SetTop(bulle, YValue);
 
                EquationName.Text = TweenEquation.Method.Name;
 
            }
        }
     }
}

Voici maintenant le code logique du côté de la Page.xaml pour instancier ce composant dynamiquement.

namespace TweenEquationSlideShow
{
	public partial class Page : UserControl
	{
		public Page()
		{
			// Required to initialize variables
			InitializeComponent();
			Loaded += new RoutedEventHandler(Page_Loaded);
		}
 
		void Page_Loaded(object sender, RoutedEventArgs e)
		{
			//dans un premier temps je récupère la classe TweenedEquations en tant que Type
			Type myTypeEq = typeof(Tweened.TweenedEquations);
 
			var b = true;
			//dans un second temps, je parcours les méthodes de ce type
			foreach (MemberInfo memberInfo in myTypeEq.GetMethods())
			{
				//si le nom de celles-ci commence par Ease 
				if (memberInfo.Name.IndexOf("Ease", 0) != -1)
				{
					//alors je récupère la méthode sous forme d'objet MethodInfo
					MethodInfo myMethod = myTypeEq.GetMethod(memberInfo.Name);
					//je crée une nouvelle délégation à partir de cet objet
					var myD = Delegate.CreateDelegate(typeof (Func<double ,double,double,double,double>),myMethod);
					//cela revient à récupérer la référence de cette fonction, pas à l'appeler
					//j'instancie le UserControl personnalisé en lui passant en premier paramêtre l'équation récupérée dynamiquement
                    			TweenedEquationThumb tetb = new TweenedEquationThumb((Func</double><double ,double,double,double,double>)myD, -55, 0, 65);
                    			//par la suite vous pourriez même 
                    			if (b) CurveIn.Children.Add(tetb); 
                    			else CurveOut.Children.Add(tetb); 
                    			b = !b
                		}
            		}
        	}
	}
}</double>
Bookmark and Share

Leave a Reply

Security Code: