2010-02-03 27 views
4

委託請專注C#:與通用

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

下面的代碼裏面。

Converter<PointF, Point>包含兩個類型參數?爲什麼PointFToPoint只保存一個參數?

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

你能澄清你的問題嗎?我不確定我是否理解你想要的只是一個句子和一個有點冗長的代碼片段。 – bakasan 2010-02-03 07:36:02

+0

我認爲作者試圖瞭解有關轉換器的msdn文章:http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx – 2010-02-03 07:38:21

+0

對不起!我想了解爲什麼PointFToPoint只保存一個參數? – Ricky 2010-02-07 02:40:52

回答

2

「轉換器擁有兩個類型參數?我怎麼知道該方法的參數上轉換器的構造函數傳遞()?」

這是轉換器的代表是如何定義的。 轉換器擁有兩個類型參數?如何儘快知道的

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

的參數,就通過將其與此簽名遵循的方法創建委託的實例(接受一個類型的值,並將其轉換成另一種類型的值),您也定義了該方法的參數。

所以,我的答案是在創建此轉換器時,您非常清楚通用轉換器方法的具體類型以及方法參數的類型。

2

唉,其實你只有一個傳遞給誰的輸出類型爲返回類型的您轉換器和輸入類型是你的自變量的輸入類型和實例參數本身的轉換參數。

2

我不太清楚你在這裏問什麼。但是表達式可以這樣寫:

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

其中p是要轉換的點。我不確定這對你有什麼幫助,但它可能會更清楚一些。

更新

此:<PointF, Point>並不意味着這個方法有兩個參數。這意味着它應該接受一個參數(類型PointF)並返回一個Point類型的對象。

2

添加到其他的答案,縮短東西,你也可以這樣寫:

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

如果你不需要,在另一個地方PointFToPoint方法,您也可以刪除整個public static Point PointFToPoint(PointF pf)方法和使用內聯委託代替:

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

如果你在.NET 3.5是可以縮短,最多一個拉姆達:

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