Метод расширения C# - добавление методов void

Методы расширения, конечно, полезны для добавления метода в класс, который вам не принадлежит.

Но я хочу практиковать эту концепцию в 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");
    }
}

Однако я получаю ошибки:

"Собака: статические типы нельзя использовать в качестве параметров"

а также

"Собака: Статические типы не могут использоваться в качестве возвращаемых типов"

Можете ли вы помочь мне, как решить эту проблему?

2 ответа

Есть некоторые проблемы:

  1. Если вам нужен метод, который ничего не возвращает, не пишите метод, который возвращает Dog:
public static Dog Jump(this Dog)
--------------^^^
public static void Jump(this Dog)
  1. Ваш параметр типа Dog не имеет имени:
public static void Jump(this Dog)
------------------------------^^^  
public static void Jump(this Dog dog)
  1. Самое важное:
    Методы расширения являются просто своего рода "синтаксическим сахаром", так что вы можете написать myDog.Jump(); вместо SomeOtherClass.Jump(myDog);,
    Это означает, что вам нужен экземпляр класса, который передается в метод расширения. Вы не можете вызвать метод расширения в классе (например, Dog.Jump();) но только на объекте (например, myDog.Jump();). Вот как работают методы расширения.
    Кроме того, ваш класс Dog статический, что означает, что вы не можете создать его экземпляр, поэтому вы не сможете вызвать Dog myDog = new Dog(); и, следовательно, не сможет вызывать методы расширения для него.

Вы должны сделать свой 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;
    }
}
Другие вопросы по тегам