我可以向现有的静态类添加扩展方法吗?

喜你入骨 提交于 2020-02-28 05:00:15

我很喜欢C#中的扩展方法,但在将扩展方法添加到静态类(例如Console)方面并没有取得成功。

例如,如果我想向控制台添加一个名为“ WriteBlueLine”的扩展,以便可以进行以下操作:

Console.WriteBlueLine("This text is blue");

我通过添加一个本地的,公共的静态方法(使用Console作为“ this”参数)来尝试了此操作……但是没有骰子!

public static class Helpers {
    public static void WriteBlueLine(this Console c, string text)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine(text);
        Console.ResetColor();
    }
}

这没有向控制台添加'WriteBlueLine'方法...我做错了吗? 还是要求不可能?


#1楼

也许您可以使用自定义名称空间和相同的类名称添加静态类:

using CLRConsole = System.Console;

namespace ExtensionMethodsDemo
{
    public static class Console
    {
        public static void WriteLine(string value)
        {
            CLRConsole.WriteLine(value);
        }

        public static void WriteBlueLine(string value)
        {
            System.ConsoleColor currentColor = CLRConsole.ForegroundColor;

            CLRConsole.ForegroundColor = System.ConsoleColor.Blue;
            CLRConsole.WriteLine(value);

            CLRConsole.ForegroundColor = currentColor;
        }

        public static System.ConsoleKeyInfo ReadKey(bool intercept)
        {
            return CLRConsole.ReadKey(intercept);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteBlueLine("This text is blue");   
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
    }
}

#2楼

您不能将静态方法添加到类型。 您只能将(伪)实例方法添加到类型的实例中。

this修饰符的要点是告诉C#编译器将实例传递到的左侧. 作为静态/扩展方法的第一个参数。

在将静态方法添加到类型的情况下,第一个参数没有实例要传递。


#3楼

是的,在有限的意义上。

public class DataSet : System.Data.DataSet
{
    public static void SpecialMethod() { }
}

这可以工作,但Console不能,因为它是静态的。

public static class Console
{       
    public static void WriteLine(String x)
    { System.Console.WriteLine(x); }

    public static void WriteBlueLine(String x)
    {
        System.Console.ForegroundColor = ConsoleColor.Blue;
        System.Console.Write(.x);           
    }
}

这是可行的,因为只要不在同一名称空间上即可。 问题是您必须为System.Console的每个方法编写一个代理静态方法。 这不一定是一件坏事,因为您可以添加以下内容:

    public static void WriteLine(String x)
    { System.Console.WriteLine(x.Replace("Fck","****")); }

要么

 public static void WriteLine(String x)
    {
        System.Console.ForegroundColor = ConsoleColor.Blue;
        System.Console.WriteLine(x); 
    }

它的工作方式是将某些内容挂接到标准WriteLine中。 它可能是行数或错误的单词过滤器等等。 只要在名称空间中指定Console时说出WebProject1并导入名称空间System,就会在System.Console上选择WebProject1.Console作为名称空间WebProject1中这些类的默认值。 因此,只要您从未指定System.Console.WriteLine,此代码会将所有Console.WriteLine调用都变为蓝色。


#4楼

当我学习扩展方法但未成功时,我尝试使用System.Environment进行此操作。 正如其他人所述,原因是因为扩展方法需要类的实例。


#5楼

不。 扩展方法定义需要您要扩展的类型的实例。 它的不幸; 我不确定为什么需要它...

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!