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