Метод вызывается так, как будто он принадлежит классу с подавленным этим параметром - PullRequest
1 голос
/ 10 января 2012

У меня есть следующий код WPF:

    public Window1()
    {
        InitializeComponent();
        FlowDocument fd = new FlowDocument();
        fd.LoadFromWordML("../../testdoc.docx");

FlowDocument (в пространстве имен System.Windows.Documents) не имеет метод LoadFromWordML.Скорее этот метод определяется локально следующим образом:

    public static void LoadFromWordML(this FlowDocument doc, string path)

Тем не менее, как вы можете видеть, LoadFromWordML вызывается так, как если бы он был методом класса FlowDocument, и фактически аргумент 'this' подавляется.

Какие возможности языка C # позволяют это делать?(И комментарий против языкового дизайна: это делает очень трудным чтение унаследованного кода.)

1 Ответ

3 голосов
/ 10 января 2012

Это называется методы расширения

Методы расширения позволяют вам «добавлять» методы к существующим типам без создания нового производного типа, перекомпиляции или иного изменения исходного типа.,Методы расширения представляют собой особый вид статического метода, но они вызываются так, как если бы они были методами экземпляра

Я столкнулся с этими проблемами, используя их

  1. Охотничья документация для выяснениягде, черт возьми, они определены.
  2. Они не могут быть определены как виртуальные, поэтому это может привести к проблемам.В одном из проектов, над которым я работал, у нас был Arc, полученный из Circle.Кто-то решил, что метод Transform должен быть методом расширения.Так что большую часть времени это работало.Преобразование Circle дало преобразованное Circle и то же самое с Arc.Но это приводит к тонким ошибкам, когда вы преобразуете Arc, когда он используется в качестве Circle ссылки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...