C#:委托使用泛型

时间:2010-02-03 07:25:19

标签: 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));
    }
}

4 个答案:

答案 0 :(得分:2)

好吧,实际上你只有一个传递给转换器的参数,它的输出类型是转换器的返回类型,输入类型是你的参数的输入类型,实例是参数本身。

答案 1 :(得分:2)

我不太确定你在这里问的是什么。但表达式可以写成:

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

其中p是您要转换的点。我不确定这会对你有什么帮助,但它可能会更清楚它的作用。

<强>更新

这个:<PointF, Point>并不意味着该方法需要两个参数。这意味着它应该采用一个参数(类型为PointF)并返回Point类型的对象。

答案 2 :(得分:2)

“Converter拥有两个类型参数?我如何知道传递给Converter()构造函数的方法的参数?”

这是转换器委托的定义方式。 Converter有两种类型参数吗?我如何知道

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

只要通过传递一个遵循此签名的方法(接受一种类型的值并将其转换为另一种类型的值)来创建此委托的实例,您也可以定义该方法的参数。

所以,我的答案是在创建这个转换器时你非常了解泛型Converter方法的具体类型,以及方法参数的类型。

答案 3 :(得分: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,则可以使用lambda来缩短它:

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