C# 了解Component.GetService()

C# 了解Component.GetService(),c#,service,components,system.componentmodel,C#,Service,Components,System.componentmodel,我在Usercontrol中有一个使用此代码的方法 public bool GetActiveDocument(ref EnvDTE.Document doc) { try { var dte = (DTE2)GetService(typeof(SDTE)); doc = dte.ActiveDocument; if (doc == null)

我在Usercontrol中有一个使用此代码的方法

        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;
        }
    }

我想将此方法移动到一个“代理”类,该类将充当VisualStudio和我的应用程序之间的中介。问题在于,只有在控件内调用活动文档时,GetService才会正确返回该文档。当我将该方法移动到代理类时,GetService没有定义。我搜索该方法来自ComponentModel.Component,因此我使代理类派生自Component。一切都可以编译,但当我请求活动文档时,总会发生异常。我发现我不太理解GetService()方法的工作原理。请对此提供帮助。

Component.GetService在分配给该组件的站点属性的ISite实例上调用IServiceProvider.GetService(假设存在)。您不需要让您的代理实例从组件继承,但需要授予它访问ISite/IServiceProvider的权限。

谢谢您的帮助。我仍然不太明白,但我只需要通过ISite的引用调用GetService。我的疑问是,当我将光标放在原始GetService方法上时,Intellisense告诉我,我实际调用的是Component.GetService,而不是IServiceProvider.GetService?Component.GetService的实现调用Site属性的GetService方法。Intellisense显示文档,而不是实现。如果您对Component.GetService实现的细节感兴趣,您可能需要获取Reflector()的副本。然后我看了一下GetService的实现,正如您所说的,它的实现对象是调用GetService()方法的最终责任。多么令人印象深刻的工具,他们如何设法重建代码令人印象深刻。我仍然觉得我对组件模型没有真正的理解,但这确实有助于启蒙,:)。我将继续搜索这个主题。