如何用c#扩展方法扩展一个类?

扩展方法可以应用于课堂吗?

例如,扩展DateTime以包含Tomorrow()方法,该方法可以被调用,如:

DateTime.Tomorrow(); 

我知道我可以使用

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

要么

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

对于类似的结果,但我怎样才能扩展date时间,以便我可以调用DateTime.Tomorrow?

除非现有types被标记为部分,否则不能将方法添加到现有types中,只能通过扩展方法添加看起来是现有types成员的方法。 由于这种情况,你不能将静态方法添加到types本身,因为扩展方法使用该types的实例。

没有什么能阻止你创build你自己的静态帮助器方法,如下所示:

 static class DateTimeHelper { public static DateTime Tomorrow { get { return DateTime.Now.AddDays(1); } } } 

你会这样使用:

 DateTime tomorrow = DateTimeHelper.Tomorrow; 

使用扩展方法 。

例如:

 namespace ExtensionMethods { public static class MyExtensionMethods { public static DateTime Tomorrow(this DateTime date) { return date.AddDays(1); } } } 

用法:

 DateTime.Now.Tomorrow(); 

要么

 AnyObjectOfTypeDateTime.Tomorrow(); 

扩展方法是语法糖,用于使静态方法的第一个参数是typesT的实例,看起来好像它们是在T上的实例方法。

因为这样做的好处很大程度上是因为你在做'静态扩展方法'的时候丢失的,因为它们会使代码的读者比扩展方法混淆(因为它们似乎是完全限定的,但是在这个类中实际上并没有定义)因为没有语法上的收获(例如,能够在Linq中以stream畅的风格链接调用)。

既然你将不得不把这些扩展带入一个使用范围,那么我会争辩说,创build它更简单,更安全:

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

然后在你的代码中使用这个:

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

最接近我可以得到答案是通过添加到System.Type对象的扩展方法。 不漂亮,但仍然有趣。

 public static class Foo { public static void Bar() { var now = DateTime.Now; var tomorrow = typeof(DateTime).Tomorrow(); } public static DateTime Tomorrow(this System.Type type) { if (type == typeof(DateTime)) { return DateTime.Now.AddDays(1); } else { throw new InvalidOperationException(); } } } 

否则,IMO安德鲁和ShuggyCoUk有更好的实施。

我会像Kumu一样

 namespace ExtensionMethods { public static class MyExtensionMethods { public static DateTime Tomorrow(this DateTime date) { return date.AddDays(1); } } } 

但是把它叫做这个新的DateTime()。Tomorrow();

认为它比DateTime.Now.Tomorrow()更多seens。

它们提供了通过添加新的方法来扩展现有types的能力,而不需要对该types进行必要的修改。 使用实例方法语法在应用程序内调用扩展types对象的方法称为“扩展”方法。 扩展方法不是types上的实例成员。 要记住的关键点是,只有当通过using指令将名称空间显式导入到应用程序源代码中时,定义为静态方法的扩展方法才在范围内。 尽pipe扩展方法被定义为静态方法,但仍然使用实例语法来调用它们。

查看完整的示例http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201

例:

 class Extension { static void Main(string[] args) { string s = "sudhakar"; Console.WriteLine(s.GetWordCount()); Console.ReadLine(); } } public static class MyMathExtension { public static int GetWordCount(this System.String mystring) { return mystring.Length; } } 

我正在寻找类似的东西 – 一个提供扩展方法的类的约束列表。 似乎很难find一个简洁的清单,所以这里:

  1. 你不能有任何私人或保护任何东西 – 领域,方法等

  2. 它必须是一个静态类,如在public static class...

  3. 只有方法可以在课堂上,他们都必须是公共静态的。

  4. 你不能有传统的静态方法 – 不包含这个参数的方法是不允许的。

  5. 所有的方法必须开始:

    公共静态ReturnType MethodName(这个ClassName _这个,…)

所以第一个参数总是这个参考。

有一个隐含的问题,如果你添加需要任何types的锁的方法,你不能真正在课堂上提供它。 通常你会提供一个私有的实例级别的锁,但是不可能添加任何私有字段,给你一些非常尴尬的select,比如把它作为一个外部类的公共静态提供给你,等等。 C#语言在devise上遇到了一些不好的转机 。

解决方法是使用扩展方法类作为普通类的Facade,并且您的扩展类中的所有静态方法只是调用真实类,可能使用单例 。

不幸的是,你不能这样做。 不过,我相信这会很有用。 input以下内容更自然:

 DateTime.Tomorrow 

比:

 DateTimeUtil.Tomorrow 

用一个Util类,你必须在两个不同的类中检查一个静态方法的存在,而不是一个。

我们对答案进行了详细的解释,现在更容易理解扩展方法

扩展方法 :通过这种机制,我们可以扩展现有类的行为,而无需使用子类或修改或重新编译原始类或结构。

我们可以扩展我们的自定义类,.NET框架类等。

扩展方法实际上是静态类中定义的一种特殊的静态方法。

由于DateTime类已经在上面了,所以我们没有把这个类作为解释。

下面是例子

//这是一个现有的Calculator类,它只有一个方法(Add)

 public class Calculator { public double Add(double num1, double num2) { return num1 + num2; } } // Below is the extension class which have one extension method. public static class Extension { // It is extension method and it's first parameter is a calculator class.It's behavior is going to extend. public static double Division(this Calculator cal, double num1,double num2){ return num1 / num2; } } // We have tested the extension method below. class Program { static void Main(string[] args) { Calculator cal = new Calculator(); double add=cal.Add(10, 10); // It is a extension method in Calculator class. double add=cal.Division(100, 10) } }