2010-06-29 2 views
10

J'ai juste un point de curiosité. Je travaille avec SSRS et appelle ses méthodes SOAP. J'ai des stubs générés/des références Web créées et tout fonctionne bien et je peux faire des appels de service Web OK. Le problème: les deux classes générées à partir des WSDL, ReportService2005 et ReportExecution, ont des définitions de classes qui se chevauchent, telles que ParameterValue, DataSourceCredentials, ReportParameter. En C#, est-il possible de dire "Pour ce bloc de code dans la méthode, utilisez cet espace de noms?"C#: Utiliser un espace de nom pour un bloc de code spécifique?

Pseudo/la plupart du temps le code build-erreur:

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

Je comprends que je peux écrire le nom complet, ReportService2005.ParameterValue [] valeurs = null. Ou je peux alias les deux classes en haut avant ma déclaration de classe/contrôleur. C'est juste quelque chose que je suis curieux.

+0

Cool. Merci les gars. Je trouve bizarrement amusant d'apprendre la syntaxe de différents langages. Je vais l'admettre, je suis un geek. – Jason

+0

Un espace de noms par méthode serait particulièrement utile lorsque vous utilisez des bibliothèques qui fournissent des méthodes d'extension pour des types de base comme 'String' (par exemple Flurl [http://tmenier.github.io/Flurl/]) qui inonde Intellisense pour l'intégralité du fichier de code . – springy76

Répondre

12

Comme d'autres l'ont écrit, je ne pense pas que ce soit possible. Mais ce que vous pouvez faire, est un alias le plein namespaces au lieu de chaque classe unique que vous souhaitez utiliser, par exemple:

using rs = ReportService2005; 
using re = ReportExecution; 

// ... 

rs.ParameterValue[] values = null; 
rs.DataSourceCredentials[] credentials = null; 
rs.ReportParameter[] parameters; 
re.ParameterValue v2 = ...; 
+0

J'utiliserais probablement un nom plus expressif que 'rs' et' re' si ... – Svish

1

Malheureusement pas. Il n'y a pas de telle syntaxe pour répondre à ce besoin.

2

Je ne pense pas que vous puissiez le faire. Vous devez spécifier le nom complet qualifié pour le faire.

0

il AFAIK ne peut se faire

1

Si les classes qui se chevauchent sont identiques (et pas seulement le même nom) et partagent le même espace de noms XML , etc., alors vous pouvez profiter de la fonction sharetypes de l'outil wsdl.exe pour générer vos deux proxys de service Web afin qu'ils partagent les mêmes définitions de type pour ces classes qui se chevauchent.

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

Découvrez l'option "/ de sharetypes" pour voir si cela fonctionne pour votre situation.

+0

Oh je ne m'en suis pas rendu compte. J'ai utilisé l'outil de référence Web de VS2010. Je vais essayer. – Jason

+0

Je crois que le générateur de proxy VS (l'outil de référence Web) utilise réellement l'outil wsdl.exe dans les coulisses. Si cette option fonctionne pour vous, alors génial. L'inconvénient est que si vos services web changent, alors vous devrez relancer la commande au lieu de simplement cliquer avec le bouton droit de la souris sur la référence web dans Visual Studio et choisir "Update". Cependant, cela ne devrait pas être trop mauvais. Vous pouvez placer la commande dans un fichier batch ou un script de construction pour simplifier le processus. –

1

Bien que cela ne soit pas pertinent pour travailler avec Espaces de nommage, ou C#, VB.NET prend en charge le mot-clé With qui peut être utilisé comme un raccourci pour accéder à des membres d'un objet:

SomeReallyLongName.Property1 = 1 
SomeReallyLongName.Property2 = 2 
SomeReallyLongName.Property3 = 3 
SomeReallyLongName.Property4 = 4 
SomeReallyLongName.Property5 = 5 

peut être réécrite comme:

With SomeReallyLongName 
    .Property1 = 1 
    .Property2 = 2 
    .Property3 = 3 
    .Property4 = 4 
    .Property5 = 5 
End With 

Ce n'est pas en C#, comme vous pouvez obtenir très proche le même comportement à l'aide d'autres abordés:

  • en utilisant les noms de variables plus courtes
  • Utilisation des importations-aliasing (Tels que Martin suggéré)
+0

Oh, intéressant. Bien que je n'utilise pas VB.NET, encore cool de savoir. Merci. – Jason

2

Ce que vous pouvez faire, est la marque de votre classe partielle:

public partial class MyWebServiceClass 

dans votre fichier source principal, et créer un second fichier source avec la méthode où vous voulez utiliser l'autre espace de noms

// MyWebServiceClass.usingMethods.cs 

using ReportService2005; 
public partial class MyWebServiceClass 
{ 
    // methods... 
} 
+0

Certes, vous ne pouvez toujours pas mélanger les espaces de noms par défaut dans une méthode, utilisez donc les autres suggestions ici, mais de cette façon, vous pouvez séparer les méthodes si vous voulez avoir un espace de noms par défaut pour une ou deux méthodes seulement. – maxwellb

7

un autre peu connu fonctionnalité C# qui pourraient vous intéresser, et est similaire à la réponse de Martin, est essentiellement une classe aliasing dans les blocs Imports:

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

et déclarer comme

ListOfDictionary list = new ListOfDictionary(); 

Remarque Cette fonction, et de l'échantillon, ont été trouvés dans une autre question; spécifiquement: Hidden Features of C#?

+0

C'est vraiment cool. Avoir à publier l'alias dans chaque fichier est un gros détriment, cependant. Quelque chose comme ça qui fonctionne à l'échelle des noms serait très utile. – zanlok

+0

Si c'est quelque chose que vous avez vraiment besoin d'utiliser largement, il pourrait être préférable d'hériter. Ce type d'alias est pratique pour un usage unique, en particulier parce que vous n'avez pas à quitter le fichier de classe pour comprendre d'où vient ce type inconnu. – STW

Questions connexes