2017-01-12 60 views
0

扩展方法当然可用于将方法添加到您不属于的类。c#扩展方法 - 添加一个无效方法

但我想在Visual Studio中练习这个概念,但不确定所需的符号。

例如,我有下面的类

public static class Dog 
{ 
    public static void Bark() 
    { 
     Console.WriteLine("Woof!"); 
    } 
} 

假设我并不拥有这个方法(这是我做的,但让我们假装我不知道)。我如何着手使用一种新方法(本质上是void)来扩展这个类,这个方法叫做Jump,其中所有的新方法都会在控制台上打印Dog跳转的内容。

我试图这样使用补充:

public static class SomeOtherClass 
{ 
    //extension method to the Dog class 
    public static Dog Jump(this Dog) 
    { 
     Console.WriteLine("Dog Jumped"); 
    } 
} 

不过,我得到错误:

“狗:静态类型不能用作参数”

“Dog:静态类型不能用作退货类型“

你能帮我解决这个问题吗?

+0

“我得到一个错误”从来没有说过有用的东西。是*具体* - 你收到什么错误? –

+0

另外,你说过你想添加一个void方法 - 那么为什么在你尝试定义一个返回'Dog'的方法呢? –

+0

我得到的错误是“狗:静态类型不能用作参数” –

回答

1

你需要让你的Dog类非静态和参数添加到Jump并返回它:

public class Dog { ... } 

public static class SomeOtherClass 
{ 
    //extension method to the Dog class 
    public static Dog Jump(this Dog dog) 
    { 
     Console.WriteLine("Dog Jumped"); 
     return dog; 
    } 
} 
+0

我试过这个。但是仍然会得到相同的错误,并在'跳转' –

+0

@ Baba.S下面出现一条波浪线 - 错误说的是什么? – Lee

+0

这是因为你的'Dog'类是'static'。从这个类中移除'static'关键字。 – Bidou

4

有一些问题:

  1. 如果你想不返回任何内容的方法,请不要写出返回的方法Dog
public static Dog Jump(this Dog) 
--------------^^^ 
public static void Jump(this Dog) 
  • Dog类型的参数没有名称:
  • public static void Jump(this Dog) 
    ------------------------------^^^ 
    public static void Jump(this Dog dog) 
    
  • 最重要的是:
    扩展方法只是某种“语法糖”,因此您可以编写myDog.Jump();而不是SomeOtherClass.Jump(myDog);
    这意味着您需要传递给扩展方法的类的实例。您不能在类别(例如Dog.Jump();)上调用扩展方法,但只能在对象(例如myDog.Jump();)上调用扩展方法。这就是扩展方法的工作原理。
    此外,你的类Dog是静态的,这意味着你不能创建它的一个实例,所以你将无法调用Dog myDog = new Dog();,因此将无法调用它的扩展方法。