繁体   English   中英

C#:委托使用泛型

[英]C#: delegate with generic

请关注

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));
    }
}

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

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

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

其中p是您要转换的点。 我不确定这会以任何方式帮助你,但它可能会更清楚它的作用。

更新

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

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

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

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

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

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

添加其他答案,缩短时间你也可以写:

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)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM