others - 如何使用 C# extension方法扩展类?

可以extension方法应用于类?

例如扩展DateTime用来包括一个可以调用的Tomorrow() 方法,如下所示:


DateTime.Tomorrow();



我知道我可以使用


static DateTime Tomorrow(this Datetime value) {//... }



或者


public static MyClass {


 public static Tomorrow() {//... }


}



对于类似的结果,但是如何扩展DateTime以便能够调用 DateTime.Tomorrow?

时间:

除非现有类型标记为partial,否则无法将方法添加到现有类型,只能通过扩展方法添加看似现有类型成员的方法。 由于这种情况,你不能向类型本身添加 static 方法,因为extension方法使用该类型的实例。

在创建自己的static helper 方法时,没有什么可以阻止你:


static class DateTimeHelper


{


 public static DateTime Tomorrow


 {


 get { return DateTime.Now.AddDays(1); }


 }


}



你可以这样使用:


DateTime tomorrow = DateTimeHelper.Tomorrow;



使用extension方法

比如:


namespace ExtensionMethods


{


 public static class MyExtensionMethods


 {


 public static DateTime Tomorrow(this DateTime date)


 {


 return date.AddDays(1);


 } 


 }


}



使用方法:


DateTime.Now.Tomorrow();



或者


AnyObjectOfTypeDateTime.Tomorrow();



extension方法是用于制作 static 方法的语法单元,它的第一个参数是T 类型的实例。

因此,在制作'静态extension方法'的情况下,很大程度上会失去这些好处,因为它们会使代码的读者比extension方法更加困惑(因为它们看起来完全合格, 但不是实际上在该类中定义)没有语法上的好处(例如能够在Linq中以流畅的方式链接调用)。

因为无论如何你必须将extension带入变量范围,我认为创建它更简单,更安全:


public static class DateTimeUtils


{


 public static DateTime Tomorrow { get {.. . } }


}



然后通过以下方式在代码中使用:


WriteLine("{0}", DateTimeUtils.Tomorrow)



...