在Visual Studio中使用对象浏览器我正在尝试在便携式库中找到一种捕获主机默认代理设置的方法。
这是一个很长的镜头,我知道。并非所有平台都有这样的概念,因此可能在可移植库中不存在这样的API,但我无法理解为什么对象浏览器向我显示静态属性WebRequest.DefaultWebProxy
因为我无法使用它在代码中,它不存在。
你可以看到我将搜索限制在.NET Portable Subset。
我误解了什么?
答案 0 :(得分:2)
实际上可以隐藏IntelliSense中的类和结构成员。这并不意味着它不存在,IntelliSense就不会显示它。我见过一些没有出现在IntelliSense中的BCL类成员。
如果您知道它存在,您可以使用它。您不应该在所述属性或方法下获得红色波浪形(除非您使用不正确)。
查看EditorBrowsableAttribute文档。还有一个BrowsableAttribute
,用于确定在使用可视化设计器时是否在控件的属性网格中显示属性。
UPDATE:对于有问题的特定静态属性,我上面写的内容无关紧要。我像你一样进行搜索。问题是WebRequest
对象不存在于可移植库的System.dll中。相反,此对象驻留在System.Net.Requests.dll
程序集中。命名空间仍然相同 - System.Net
。尝试添加对System.Net.Requests.dll
的引用。
使用对象浏览器并执行搜索时,选择您感兴趣的成员。然后,单击搜索栏旁边带有红色“X”的按钮。这将清除搜索结果列表,但仍会选择之前选择的成员。然后,您将能够看到该成员驻留在BCL(或者在您的情况下是可移植类库)中的位置。执行这些步骤时,您可以看到该成员位于WebRequest
命名空间中的System.Net
类中,但它位于System.Net.Requests
程序集中。
答案 1 :(得分:2)
当您在该列表中选择一个程序集时,您可以看到它来自哪里:
C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETPortable \ v4.5
PCL参考程序集的“主目录”。但这不是降压停止的地方。 Profile和v4.0 \ Profile目录中有大量子目录,其目录的名称类似于“Profilexxx”,其中xxx是一个数字。它们包含替代引用程序集,其中包含您在创建项目时选择的特定目标集中的可用类。实际上,他们将删除在您选择的某个目标中不支持的类。
对象浏览器中的缺陷是它不知道这些替代品,并且不知道您选择了哪个特定的配置文件。它只能看到主目录中的引用程序集。大概是VS源代码中的某个// TODO。
答案 2 :(得分:0)
我不清楚它是否会导致您的问题,但VS2012对象浏览器似乎有一个错误,在某些情况下会导致它显示实际不存在的属性。如果您的解决方案有两个项目,每个项目都引用同一个完全限定类的不同定义,就会发生这种情况。
示例:
我正在使用ASP网格的第三方库(DevExpress)。
在项目A中,我有DevExpress.Data.v9.1.Linq.dll定义 DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs,包含2个公共属性,QueryableSource和KeyExpression。
在项目B中,在同一解决方案中,我有DevExpress.Web.v11.2.dll定义 具有3个公共属性的DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs,QueryableSource和KeyExpression,和DefaultSorting 。
如果我打开一个包含项目A和B的解决方案,并打开ObjectBrowser来检查DevExpress.Data.v9.1.Linq.dll,它会显示公共属性DefaultSorting是这个类的成员(当真的这个属性时在v9.1 dll中不存在。如果您尝试在代码中使用此属性,您将收到编译器错误,该类"不包含' DefaultSorting'"
的定义如果我打开一个不同的解决方案,其中只包含项目A 而不是项目B ,并打开ObjectBrowser以检查与上面相同的v9.1 dll,它会正确显示缺少公共属性DefaultSorting。
如果这是上述问题的原因,那么在同一解决方案中打开并使用.NET Portable Subset以及更广泛的.NET框架可能会触发此ObjectBrowser错误。 这可能导致VS2012向您显示仅属于完整框架的属性,即使您使用对象浏览器检查可移植子集也是如此。