c#无参数扩展方法

Posted

技术标签:

【中文标题】c#无参数扩展方法【英文标题】:c# parameterless extension method [duplicate] 【发布时间】:2014-03-25 12:37:05 【问题描述】:

是否可以创建不带参数的扩展方法?我是使用扩展方法的新手,只见过使用参数的方法。

来自RB Whitaker's C# tutorial:

public static class StringExtensions

    private static Random random = new Random();

    public static string ToRandomCase(this string text)
    
        string result = "";

        for (int index = 0; index < text.Length; index++)
        
            if (random.Next(2) == 0)
            
                result += text.Substring(index, 1).ToUpper();
            
            else
            
                result += text.Substring(index, 1).ToLower();
                            
        

        return result;
    

还有来自MSDN:

“他们的第一个参数指定方法操作的类型,参数前面是this修饰符。”

这两个,尤其是每个站点上的代码示例(此处仅发布一个)似乎表明扩展方法必须具有至少一个参数,因为该参数用于附加 this 关键字 to,允许该方法注册为它后面的类或类型的扩展。例如,

public static StringExtension(this String a) /*stuff*/

(如果是这种情况,那么这也意味着扩展方法中的第一个参数必须接受它正在扩展的类的实例,所以我可能错了。)

【问题讨论】:

你为什么想要一个无参数的扩展方法?那么它会扩展什么? 我认为它会像标准库中不带参数的任何方法一样运行,例如 Console.Read()。这个问题意味着您可以定义一个没有参数的扩展方法,并且(理论上)将其称为 Console.MyExt();但我发现事实并非如此。 @Stopforgettingmyaccounts... 注意扩展方法需要一个instance,但是Console是一个类,所以你不能写一个扩展方法用作静态方法,如Console.MyExt()。见Can I add extension methods to an existing static class? 如果类是静态的,那将毫无意义。 【参考方案1】:

没错。扩展方法至少需要一个参数,用this修饰符标记。

但是,当使用对您要扩展的类的引用来调用扩展方法时,您不会指定参数:

"foo".StringExtension();

相当于:

StringExtensions.StringExtension("foo");

即使您实际上没有使用方法中的参数,也必须声明它以使用扩展方法提供的语法。

【讨论】:

很好,所以在调用扩展方法的时候,第一个参数是隐藏的? @Stopforgettingmyaccounts... 正确。编译器将 . 左侧的对象作为第一个参数隐式传递给函数。

以上是关于c#无参数扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

.NET(C#) Nullable(可空类型)通过扩展方法传委托参数调用方法

C# this扩展方法

C#高级功能扩展方法和索引

C#的扩展方法解析

C# 语法 ( 扩展方法 )

C# this用法系列 通过this修饰符为原始类型扩展方法