2010-07-19 9 views
2

J'ai un projet webservice avec une classe (appelons-le webservice.classA).Comment affecter un objet de même classe déclaré dans 2 espaces de noms différents

J'ai un autre projet de classe produisant une DLL qui fait référence à cette classe dans son propre espace de noms et instancie une instance de celle-ci (appelons l'espace de noms dllspace).

Dans un autre projet, je veux accéder au membre de la dll

par exemple

using webservice; 

namespace other_project 
{ 
    class B 
    { 
     classA copy = null; 
     //.... 
     dllnamespace.dostuff(); // amongst other things instantiates a classA object 
     //.... 
     copy = dllnamespace.getclassA(); // method to return classA member 

L'erreur du compilateur que je reçois est ne peut pas convertir le type de dllnamespace.webservice.classA à other_project.webservice.classA

Je suppose que j'ai un défaut de conception fondamentale, mais je me dis que il doit y avoir (?) Un façon de déclarer/utiliser "webservice.classA" dans plus d'un espace de noms.

Répondre

1

Modifiez la ligne de définition de copie à:

dllnamespace.webservice.classA copy = null; 
2

Vous avez un conflit de noms. La façon soutenue d'éviter cette (peu de ne pas nommer vos classes les mêmes), est de définir un using alias pour l'une des classes:

using webservice.classA = myWebserviceClassA; 
+0

Je ne suis pas sûr si l'alias sur le RHS est correct?!?. –

+0

@Shankar, il est supporté pour déclarer un alias de cette façon. N'hésitez pas à vérifier avec le compilateur :-) (Et en passant, cela correspond au 2ème exemple du lien dans la réponse). – driis

+0

Je sais que cela limite le nitpicking :-) ... mais juste vérifié dans mon VS 2008 ... avoir l'alias sur le côté droit donne une erreur de compilateur. En supposant que -myWeberviceClassA -... apparaît sur le côté gauche de l'équation ... :-) ... c'est correct. –

-1

C'est juste le problème - vous ne pouvez pas avoir une classe dans plus d'un espace de noms . C'est pour cela que les espaces de noms ont été conçus - pour éviter que des classes portant le même nom soient écrites par des personnes différentes à partir d'alias. Vous devrez décider pour l'un de vos espaces de noms de posséder cette classe et dans l'autre pour l'importer. Sinon, si la DLL et le service Web font partie de la même application distribuée, ils doivent utiliser le même espace de noms.

+0

Je suis assez nouveau (bleedin 'évident) aux espaces de noms. Je suppose que vous avez raison et que, dans ce cas, il serait logique que l'autre projet ait le même espace de noms. – pyb

2

Vous avez raison ... le défaut de conception existe en termes de nommage.

Admettons:

  • vous avez une classe nommée MyClass

  • la classe existe deux dans abc.xyz.qwe.tyu.MyClass Espace de nommage

  • et espace de noms - sed.qwe.dfg.ert.MyClass

La solution est -

using NS1 = abc.xyz.qwe.tyu.MyClass; 
using NS2 = sed.qwe.dfg.ert.MyClass; 

De cette façon, vous éviter le choc. Aussi, utile à utiliser si vous avez très long espaces de noms.

RÉFÉRENCE DE PLUS: (Tirée de l'article MSDN sur using Directive)

  • La portée d'une utilisant directive est limitée au fichier dans lequel il apparaît .

  • Créer une utilisant alias pour le rendre plus facile de se qualifier un identifiant à un espace de noms ou le type.

  • Créez une en utilisant la directive pour utiliser les types dans un espace de noms sans avoir à spécifier l'espace de noms. Une directive utilisant la directive ne vous donne pas accès aux espaces de noms imbriqués dans l'espace de noms que vous spécifiez.

Questions connexes