2010-04-29 19 views
4

Si j'ai un nouveau projet (ProjNew) où je veux mettre plusieurs classes qui sont sur un autre projet (ProjOld).Nom de classe ambigu

Le problème est que je veux maintenir les anciennes classes marquées avec Obsolète pour éviter d'exécuter tous mes projets et vérifier si elles l'utilisent. Mais de cette façon, cela peut provoquer une erreur de nom de classe ambiguë parce que je n'ai pas appelé explicitement par l'espace de noms.

Existe-t-il un moyen de dire dans l'obsolète quel assemblage utiliser dans un cas d'ambiguïté?

Répondre

0

Marquer vos classes avec System.ObsoleteAttribute

http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx

using System; 

class Program 
{ 
    static void Main() 
    { 
     MethodA(); 
    } 

    [Obsolete("Use MethodB instead")] 
    static void MethodA() 
    { 
    } 

    static void MethodB() 
    { 
    } 
} 
+0

Est-ce que cette adresse les OP doivent avoir 2 classes avec le même nom? Une classe peut-elle être marquée comme obsolète tout en ayant une autre classe avec le même nom utilisé dans le même espace de noms? (D'après les apparences, votre exemple montre que le membre d'une classe est obsolète, pas la classe elle-même) –

1

Vous pouvez créer les classes comme partial classes et marquer les méthodes que vous devez être obsolète. Cela vous permettra de diviser vos classes en plusieurs fichiers et d'utiliser toujours le même nom de classe.

+1

Les classes partielles ne traversent pas les limites de l'assemblage. –

+0

Ah! Je ne m'en suis pas rendu compte mais cela a du sens. Bravo à la tête d'Eric. –

2

Je ne suis pas sûr si je comprends entièrement votre question, mais cela peut aider. Vous pouvez utiliser une directive Using pour préciser quelle classe utiliser. Un exemple: en utilisant ClassA = OldAssembly.ClassA;

Toute référence à ClassA se référera alors à OldAssembly.

0

OK. Il semble que si j'ajoute la même classe à un autre espace de noms, l'erreur ambiguos c'est juste que j'arrive à la compilation. J'avais peur que cela se produise en cours d'exécution, mais je l'ai testé et il n'y avait pas de problème.

Merci

4

Il est pas tout à fait clair ce que vous demandez, mais je vais faire un essai de toute façon.

Supposons que vous ayez deux DLL, old.dll et new.dll, qui ont tous deux un espace de noms N avec un type C. Vous pouvez faire ceci:

csc /r:NEW=new.dll /r:OLD=old.dll foo.cs 

puis en foo.cs vous pouvez Dites

extern alias NEW; 
extern alias OLD; 
class D : NEW::N.C { } 
class E : OLD::N.C { } 

et D héritera de la CN dans new.dll, E héritera de la NC dans old.dll.

Est-ce que cela résout votre problème?