C #: Использовать пространство имен для определенного блока кода? - PullRequest
11 голосов
/ 29 июня 2010

У меня просто есть любопытство. Я работаю с SSRS и вызываю его методы SOAP. У меня есть сгенерированные заглушки / веб-ссылки, и все работает нормально, и я могу делать вызовы веб-службы в порядке.

Проблема: два класса, сгенерированные из WSDL, ReportService2005 и ReportExecution, имеют некоторые перекрывающиеся определения классов, такие как ParameterValue, DataSourceCredentials, ReportParameter.

В C # есть ли способ сказать: «Для этого блока кода в методе использовать это пространство имен?»

Псевдо / в основном код ошибки сборки:

use-this-namespace (ReportService2005)
{
    ParameterValue[] values = null;
    DataSourceCredentials[] credentials = null;
    ReportParameter[] parameters;
}

Я понимаю, что могу просто написать полное имя, ReportService2005.ParameterValue [] values ​​= null. Или я могу псевдоним двух классов в верхней части до объявления моего класса / контроллера. Мне просто интересно это.

Ответы [ 8 ]

14 голосов
/ 29 июня 2010

Как написали другие, я не думаю, что это возможно.Но вы можете создать псевдонимы для полных пространств имен вместо каждого отдельного класса, который вы хотите использовать, например:

using rs = ReportService2005;
using re = ReportExecution;

// ...

rs.ParameterValue[] values = null;
rs.DataSourceCredentials[] credentials = null;
rs.ReportParameter[] parameters;
re.ParameterValue v2 = ...;
7 голосов
/ 30 июня 2010

Еще одна малоизвестная функция C #, которая может вас заинтересовать и которая похожа на ответ Мартина, по сути, создает псевдоним класса в блоках Imports:

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

и объявляет его

ListOfDictionary list = new ListOfDictionary();

Примечание Эта функция и пример были найдены в другом вопросе;в частности: Скрытые возможности C #?

2 голосов
/ 30 июня 2010

Что вы можете сделать, это пометить ваш класс как частичный:

public partial class MyWebServiceClass

в вашем основном исходном файле и создайте второй исходный файл с методом, в котором вы хотите использовать другое пространство имен

// MyWebServiceClass.usingMethods.cs

using ReportService2005;
public partial class MyWebServiceClass
{
    // methods...
}
2 голосов
/ 29 июня 2010

Я не думаю, что вы можете сделать это.Вы должны указать полное имя, чтобы сделать это.

1 голос
/ 30 июня 2010

Хотя это и не актуально для работы с пространствами имен или 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 предлагаем)
1 голос
/ 30 июня 2010

Если перекрывающиеся классы идентичны (а не просто имеют одинаковые имена) и совместно используют одно и то же пространство имен XML и т. Д., Вы можете воспользоваться функцией sharetypes инструмента wsdl.exe для генерации обоих прокси-серверов веб-службы.чтобы они использовали одни и те же определения типов для этих перекрывающихся классов.

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

Проверьте параметр "/ sharetypes", чтобы проверить, подходит ли это для вашей ситуации.

1 голос
/ 29 июня 2010

К сожалению нет.Нет такого синтаксиса для удовлетворения этой потребности.

0 голосов
/ 29 июня 2010

AFAIK это не может быть сделано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...