2010-02-03 5 views
4

S'il vous plaît se concentrer surC#: déléguer avec générique

List<Point> lp = lpf.ConvertAll( 
       new Converter<PointF, Point>(PointFToPoint)); 

dans les codes ci-dessous.

Converter<PointF, Point> contient deux paramètres de type? Pourquoi PointFToPoint ne contient qu'un seul paramètre?

public class Example 
{ 
    public static void Main() 
    { 
     List<PointF> lpf = new List<PointF>(); 

     lpf.Add(new PointF(27.8F, 32.62F)); 
     lpf.Add(new PointF(99.3F, 147.273F)); 
     lpf.Add(new PointF(7.5F, 1412.2F)); 

     Console.WriteLine(); 
     foreach(PointF p in lpf) 
     { 
      Console.WriteLine(p); 
     } 

     List<Point> lp = lpf.ConvertAll( 
      new Converter<PointF, Point>(PointFToPoint)); 

     Console.WriteLine(); 
     foreach(Point p in lp) 
     { 
      Console.WriteLine(p); 
     } 
    } 

    public static Point PointFToPoint(PointF pf) 
    { 
     return new Point(((int) pf.X), ((int) pf.Y)); 
    } 
} 
+0

Pouvez-vous clarifier votre question? Je ne suis pas sûr de comprendre ce que vous essayez d'obtenir à partir d'une phrase et d'un fragment de code assez long. – bakasan

+0

Je pense que l'auteur essaie de comprendre l'article msdn sur les convertisseurs: http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx –

+0

Désolé! Je voudrais comprendre pourquoi PointFToPoint tient juste un paramètre? – Ricky

Répondre

2

« Converter détient deux paramètres de type? Comment puis-je connaître les paramètres de la méthode étant transmis au constructeur de Converter()? »

Voici comment est défini délégué du convertisseur. Le convertisseur contient deux paramètres de type? Comment puis-je connaître les paramètres de la

public delegate TOutput Converter<TInput,TOutput>(TInput input); 

Dès que vous créez instance de ce délégué en adoptant une méthode qui respecte cette signature (accepter la valeur d'un type et la convertir en valeur d'un autre type), vous définir le paramètre de la méthode aussi. Donc, ma réponse est que, lors de la création de ce convertisseur, vous connaissez très bien les types concrets pour la méthode générique Converter et le paramètre Type of the method.

2

Eh bien, en fait, vous avez un seul paramètre qui est transmis au convertisseur qui est le type de sortie est le type de votre retour à convertisseur et le type d'entrée est le type d'entrée de votre argument et l'instance est l'argument lui-même.

2

Je ne suis pas sûr de ce que vous demandez ici. Mais l'expression peut être écrite comme ceci:

List<Point> lp = lpf.ConvertAll( 
      new Converter<PointF, Point>((p) => { return PointFToPoint(p); })); 

Où p est le point que vous voulez convertir. Je ne suis pas sûr que cela vous aide d'une façon ou d'une autre, mais cela pourrait être un peu plus clair.

Mise à jour

Ce: <PointF, Point> ne signifie pas que la méthode prend deux paramètres. Cela signifie qu'il devrait prendre un paramètre (type PointF) et renvoyer un objet de type Point.

2

Ajout aux autres réponses, de réduire les choses que vous pouvez également écrire:

List<Point> lp = lpf.ConvertAll(PointFToPoint); 

Si vous n'avez pas besoin cette méthode PointFToPoint dans un autre endroit, vous pouvez également supprimer toute méthode public static Point PointFToPoint(PointF pf) et utiliser un délégué en ligne à la place:

List<Point> lp = lpf.ConvertAll((delegate PointF pf) 
    { return new Point(((int) pf.X), ((int) pf.Y)); }); 

Et si vous êtes dans .NET 3.5, vous pouvez réduire cela avec un lambda:

List<Point> lp = lpf.ConvertAll(pf => new Point(((int) pf.X), ((int) pf.Y)));