С#: Использовать пространство имен для определенного блока кода?

У меня просто любопытство. Я работаю с 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 это невозможно сделать