2011-01-14 5 views
0

У меня есть метод в UserControl с этим кодомПоймите Component.GetService()

 public bool GetActiveDocument(ref EnvDTE.Document doc) 
    { 
     try 
     { 
      var dte = (DTE2)GetService(typeof(SDTE)); 
      doc = dte.ActiveDocument; 
      if (doc == null) 
      { 
       MessageBox.Show("There isn't any file open in the Code Editor"); 
       return false; 
      } 
      else return true; 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("There was a problem getting the actual file, verify if it is open"); 
      return false; 
     } 
    } 

Я хочу, чтобы переместить этот метод к классу «Proxy», который собирается выступать в качестве посредника между Visual Studio и мое заявление. Проблема в том, что GetService корректно возвращает активный документ, если это вызов внутри элемента управления. Когда я переношу этот метод в класс Proxy, у GetService нет определения. Я ищу, что этот метод исходит от ComponentModel.Component, поэтому я сделал класс Proxy от Component. Все компилируется нормально, но всегда, когда я запрашиваю активный документ, возникает исключение. Я считаю, что я не понимаю, как работает метод GetService(). Пожалуйста, помогите с этим.

ответ

1

Component.GetService вызывает IServiceProvider.GetService экземпляра ISite, назначенного для свойства сайта компонента (при условии, что он есть). Вам не нужно будет наследовать экземпляр прокси-сервера от Component, но вам нужно будет предоставить ему доступ к ISite/IServiceProvider.

+0

Спасибо, что работает. Я все еще плохо разбираюсь, но вызов GetService с рефери ISite - это все, что мне нужно. Мои сомнения в том, почему, когда я накладываю курсор на исходный метод GetService, Intellisense говорит мне, что это Component.GetService, что я на самом деле вызываю, а не IServiceProvider.GetService? – mjsr

+0

Реализация Component.GetService вызывает метод GetService свойства Site. Intellisense показывает документацию, а не реализацию. Если вас интересуют детали реализации Component.GetService, вы можете захотеть захватить копию Reflector (http://www.red-gate.com/products/dotnet-development/reflector/). –

+0

Я следую вашим советам относительно .net-отражателя. Затем я просматриваю реализацию GetService и точно так же, как вы говорите, его объект, который реализует ISite, окончательную ответственность за вызов метода GetService(). Какой впечатляющий инструмент, как им удается перестроить код, впечатляет. Я все еще чувствую, что у меня нет реального понимания модели компонентов, но это действительно помогает на пути просветления, :). Я продолжу поиск темы. – mjsr

Смежные вопросы