我只是有一点好奇心。我正在使用 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。或者我可以在类/控制器声明之前为顶部的两个类别名。这只是我好奇的事情。
正如其他人所写,我认为这是不可能的。但是您可以做的是为完整的命名空间添加别名,而不是您想要使用的每个单个类,例如:
using rs = ReportService2005;
using re = ReportExecution;
// ...
rs.ParameterValue[] values = null;
rs.DataSourceCredentials[] credentials = null;
rs.ReportParameter[] parameters;
re.ParameterValue v2 = ...;
您可能感兴趣的另一个鲜为人知的 C# 功能,与 Martin 的答案类似,本质上是在
Imports
块中为类添加别名:
using ListOfDictionary = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>;
并将其声明为
ListOfDictionary list = new ListOfDictionary();
注意 这个功能和示例是在另一个问题中找到的;具体来说:C# 的隐藏功能?
我认为你做不到。您必须指定完全限定名称才能执行此操作。
虽然与使用 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# 中,因为您可以使用其他方法非常接近相同的行为:
您可以做的是将您的课程标记为部分课程:
public partial class MyWebServiceClass
在您的主源文件中,并使用您想要使用其他命名空间的方法创建第二个源文件
// MyWebServiceClass.usingMethods.cs
using ReportService2005;
public partial class MyWebServiceClass
{
// methods...
}
不幸的是没有。没有这样的语法来满足这种需求。
如果重叠的类相同(不仅仅是命名相同)并且共享相同的 XML 命名空间等,那么您可以利用 wsdl.exe 工具的 sharetypes 功能来生成两个 Web 服务代理,以便对于那些重叠的类,它们共享相同的类型定义。
http://msdn.microsoft.com/en-us/library/7h3ystb6%28VS.80%29.aspx
查看“/sharetypes”选项,看看它是否适合您的情况。
据我所知这是做不到的
也许不完全在块的范围内,但你可以在
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
。