C#:为特定代码块使用命名空间?

问题描述 投票:0回答:9

我只是有一点好奇心。我正在使用 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[] 值= null。或者我可以在类/控制器声明之前为顶部的两个类别名。这只是我好奇的事情。

c# namespaces
9个回答
16
投票

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

using rs = ReportService2005;
using re = ReportExecution;

// ...

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

9
投票

您可能感兴趣的另一个鲜为人知的 C# 功能,与 Martin 的答案类似,本质上是在

Imports
块中为类添加别名:

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

并将其声明为

ListOfDictionary list = new ListOfDictionary();

注意 这个功能和示例是在另一个问题中找到的;具体来说:C# 的隐藏功能?


2
投票

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


2
投票

虽然与使用 Namespaces 或 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建议)

2
投票

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

public partial class MyWebServiceClass

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

// MyWebServiceClass.usingMethods.cs

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

1
投票

不幸的是没有。没有这样的语法来满足这种需求。


1
投票

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

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

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


0
投票

据我所知这是做不到的


0
投票

也许不完全在块的范围内,但你可以在

namespace
内完成。假设您有一些具有相同名称但在不同名称空间下的类(也许您正在执行一些重构或不执行其他操作):

  • MyStuff.Legacy.Hello
  • MyStuff.NG.Hello

并且您只想使用新的而不将其他所有内容过渡到

NG
,然后

using MyStuff.Legacy; // <= You still use all the old stuff

namespace MyStuff
{
    // but only want to use this new one
    using Hello = MyStuff.NG.Hello;
    ...

当您调用

namespace
时,
MyStuff.NG.Hello
范围内的所有内容都会引用
Hello

© www.soinside.com 2019 - 2024. All rights reserved.