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>

