我很喜欢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楼
不。 扩展方法定义需要您要扩展的类型的实例。 它的不幸; 我不确定为什么需要它...
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3158050