【问题标题】:C#: Use a namespace for a specific block of code?C#:为特定代码块使用命名空间?
【发布时间】:2011-03-09 19:37:20
【问题描述】:

我只是有点好奇。我正在使用 SSRS 并调用它的 SOAP 方法。我已经生成了存根/创建了 Web 引用,一切正常,我可以正常调用 Web 服务。

问题:从 WSDL 生成的两个类 ReportService2005 和 ReportExecution 有一些重叠的类定义,例如 ParameterValue、DataSourceCredentials、ReportParameter。

在C#中,有没有一种说法,“对于方法中的这段代码,使用这个命名空间?”

伪/主要是构建错误代码:

use-this-namespace (ReportService2005)
{
    ParameterValue[] values = null;
    DataSourceCredentials[] credentials = null;
    ReportParameter[] parameters;
}

我知道我可以写出全名,ReportService2005.ParameterValue[] values = null。或者我可以在我的类/控制器声明之前为顶部的两个类起别名。这只是我很好奇的事情。

【问题讨论】:

  • 酷。多谢你们。我奇怪地发现学习不同语言的语法很有趣。我承认,我是个极客。
  • 当使用为核心类型提供扩展方法的库时,每个方法的命名空间会特别方便,例如 String(例如 Flurl [tmenier.github.io/Flurl/]),它会为整个代码文件泛滥 Intellisense。跨度>

标签: c# namespaces


【解决方案1】:

正如其他人所写,我认为这是不可能的。但是您可以做的是为完整的命名空间而不是您要使用的每个单个类命名,例如:

using rs = ReportService2005;
using re = ReportExecution;

// ...

rs.ParameterValue[] values = null;
rs.DataSourceCredentials[] credentials = null;
rs.ReportParameter[] parameters;
re.ParameterValue v2 = ...;

【讨论】:

    【解决方案2】:

    您可能感兴趣的另一个鲜为人知的 C# 功能与 Martin 的回答类似,它本质上是在 Imports 块中为一个类起别名:

    using ListOfDictionary = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>;
    

    并将其声明为

    ListOfDictionary list = new ListOfDictionary();
    

    注意此功能和示例是在另一个问题中找到的;具体来说:Hidden Features of C#?

    【讨论】:

    • 这很酷。但是,必须在每个文件中发布别名是一个很大的减损。像这样在命名空间范围内工作的东西会非常有用。
    • 如果您确实需要广泛使用它,那么继承可能会更好。这种别名对于一次性使用很方便,特别是因为您不必离开类文件来找出这种未知类型的来源。
    【解决方案3】:

    我认为你做不到。您必须指定完全限定名称才能执行此操作。

    【讨论】:

      【解决方案4】:

      虽然与使用 命名空间 或 C# 无关,但 VB.NET 支持 With 关键字,该关键字可用作访问对象成员的快捷方式:

      SomeReallyLongName.Property1 = 1
      SomeReallyLongName.Property2 = 2
      SomeReallyLongName.Property3 = 3
      SomeReallyLongName.Property4 = 4
      SomeReallyLongName.Property5 = 5
      

      可以改写为:

      With SomeReallyLongName
          .Property1 = 1
          .Property2 = 2
          .Property3 = 3
          .Property4 = 4
          .Property5 = 5
      End With
      

      它不在 C# 中,因为您可以使用其他方法非常接近相同的行为:

      • 使用较短的变量名
      • 使用导入别名(如Martin 建议)

      【讨论】:

      • 哦,有趣。虽然我不使用 VB.NET,但知道仍然很酷。谢谢。
      【解决方案5】:

      您可以做的就是将您的课程标记为部分课程:

      public partial class MyWebServiceClass
      

      在您的主源文件中,并使用您要使用其他命名空间的方法创建第二个源文件

      // MyWebServiceClass.usingMethods.cs
      
      using ReportService2005;
      public partial class MyWebServiceClass
      {
          // methods...
      }
      

      【讨论】:

      • 当然,你仍然不能在一个方法中混合默认命名空间,所以在这里使用其他建议,但是这样,如果你想为一个或两个方法设置一个默认命名空间,你可以分开方法只是说。
      【解决方案6】:

      很遗憾没有。没有这样的语法可以满足这种需求。

      【讨论】:

        【解决方案7】:

        如果重叠的类是相同的(不仅仅是名称相同)并且共享相同的 XML 命名空间等,那么您可以利用 wsdl.exe 工具的 sharetypes 功能来生成两个 Web 服务代理以便它们为那些重叠的类共享相同的类型定义。

        http://msdn.microsoft.com/en-us/library/7h3ystb6%28VS.80%29.aspx

        查看“/sharetypes”选项,看看它是否适合您的情况。

        【讨论】:

        • 哦,我没有意识到。我一直在使用 VS2010 的 Web Reference 工具。我试试看。
        • 我相信VS代理生成器(网络参考工具)实际上在幕后使用了wsdl.exe工具。如果该选项对您有用,那就太好了。不利的一面是,如果您的 Web 服务发生更改,那么您将需要再次运行该命令,而不是在 Visual Studio 中右键单击 Web 引用并选择“更新”。不过,这应该不会太糟糕。您可以将命令放在批处理文件或构建脚本中以简化过程。
        【解决方案8】:

        AFAIK 做不到

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-28
          • 2014-07-17
          • 2010-11-02
          相关资源
          最近更新 更多