У меня просто есть точка любопытства. Я работаю с SSRS и называю его методы SOAP. У меня есть тупики, сгенерированные / веб-созданные ссылки, и это все хорошо работает, и я могу выполнить вызовы веб-сервиса хорошо.
Проблема: эти два класса, сгенерированные от WSDLs, ReportService2005 и ReportExecution, имеют некоторые перекрывающиеся определения классов, такие как ParameterValue, DataSourceCredentials, ReportParameter.
В C#, там способ сказать, "Для этого блока кода в методе, используйте это пространство имен?"
Псевдо / главным образом код ошибки сборки:
use-this-namespace (ReportService2005)
{
ParameterValue[] values = null;
DataSourceCredentials[] credentials = null;
ReportParameter[] parameters;
}
Я понимаю, что могу просто записать из полного имени, ReportService2005. ParameterValue [] оценивает = пустой указатель. Или я могу исказить эти два класса наверху перед моим объявлением класса/контроллера. Это - просто что-то, на предмет чего мне любопытно.
Как писали другие, я не думаю, что это возможно. Но что вы можете сделать, так это создать псевдоним для полных пространств имен вместо каждого отдельного класса, который вы хотите использовать, например:
using rs = ReportService2005;
using re = ReportExecution;
// ...
rs.ParameterValue[] values = null;
rs.DataSourceCredentials[] credentials = null;
rs.ReportParameter[] parameters;
re.ParameterValue v2 = ...;
Что вы можете сделать, так это отметить свой класс как частичный:
public partial class MyWebServiceClass
в вашем основном исходном файле и создать второй исходный файл с методом, в котором вы хотите использовать другое пространство имен
// MyWebServiceClass.usingMethods.cs
using ReportService2005;
public partial class MyWebServiceClass
{
// methods...
}
Если перекрывающиеся классы идентичны (не просто названы одинаково) и используют одно и то же пространство имен XML и т. Д., То вы можете воспользоваться функцией sharetypes инструмента wsdl.exe для создания обоих прокси веб-службы. так что они используют одни и те же определения типов для этих перекрывающихся классов.
http://msdn.microsoft.com/en-us/library/7h3ystb6%28VS.80%29.aspx
Проверьте параметр «/ sharetypes», чтобы узнать, работает ли он в вашей ситуации.
Хотя это не относится к работе с пространствами имен или 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 #, так как вы можете очень близко подойти к такому же поведению, используя другие подходы:
Я не думаю, что ты сможешь это сделать. Для этого вы должны указать полное имя.
К сожалению, нет. Нет такого синтаксиса для удовлетворения этой потребности.
Еще одна малоизвестная особенность C#, которая может вас заинтересовать, и которая похожа на ответ Мартина, это по сути алиасинг класса в блоках Imports
:
using ListOfDictionary = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>;
и объявление его как
ListOfDictionary list = new ListOfDictionary();
Примечание Эта особенность и пример были найдены в другом вопросе, а именно: Скрытые возможности C#?