Метод расширения 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 ответа
Есть некоторые проблемы:
- Если вам нужен метод, который ничего не возвращает, не пишите метод, который возвращает
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();
и, следовательно, не сможет вызывать методы расширения для него.
Вы должны сделать свой 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;
}
}