2010-01-18 4 views
3

Ce que je veux faire est d'écrire des classes en C# dans un nouvel espace de noms qui agissent comme des classes wrapper pour les classes d'un autre espace de noms. Parfois, une classe wrapper n'est pas nécessaire mais je veux toujours une classe correspondante dans le nouvel espace de noms. Et je veux une copie exacte de la classe. Existe-t-il un moyen de définir la classe dans le nouvel espace de noms en se référant à la définition d'une autre classe? En d'autres termes, je veux un alias.C# alias de type public?

Pour clarifier ce que je veux dire, si l'espace de noms existant est nommé « namespace1 » et le nouvel espace de noms est nommé « Namespace2 », en utilisant le code comme ceci dans Namespace2:

using Class1 = Namespace1.Class1; 

ne fonctionnerait pas parce que Namespace2.Class1 ne serait pas exister. Class1 serait seulement aliasé "private" à Namespace2 et non "public" à Namespace2. Si je pouvais utiliser Namepsace2.Class1 de l'extérieur de l'espace de noms, et si cela ferait encore référence à Namespace1.Class1, alors ce serait ce que je veux.

J'ai pensé qu'il pourrait y avoir un moyen d'accomplir ceci avec des attributs ou une réflexion peut-être. S'il y avait quelques directives de pré-processeur ou des macros qui pourraient copier le code qui fonctionnerait aussi, mais évidemment C# n'a rien de tel.

+0

Pourquoi ne pas hériter? – Sergei

Répondre

2

Il semble que vous ayez besoin de mapper une définition de classe à une autre.

Ceci peut être fait manuellement (grâce à beaucoup de code standard) ou automatiquement via un outil tel que AutoMapper.

4

Vous pouvez utiliser l'aide à create an alias to a type:

using Project = PC.MyCompany.Project; 
+1

Ceci est juste une astuce de compilateur, mais ne "copie" pas la classe dans l'autre espace de noms. –

+0

@Reed Copsey - Je vois ce que tu veux dire. Je ne suis pas sûr si par "copie exacte" il voulait dire une copie réelle ou juste quelque chose qui ressemble à une copie. @YWE - pouvez-vous clarifier s'il vous plaît? –

+0

Ouais - ce n'est pas clair. Je l'ai pris dans l'autre sens, puisqu'il a spécifié "public" dans la question (qui n'a aucun sens pour le type aliasing) et parce qu'il a fait référence aux "classes wrapper facultatives" ... On dirait qu'il veut une API publique copie "de l'API d'un autre espace de nommage. –

2

Si vous définissez la classe dans un espace de noms différent, ce sera une autre classe. MyNewNamespace.MyClass et MyOldNamespace.MyClass sont deux types distincts dans .NET.

Vous pouvez facilement encapsuler toutes les API publiques de votre première classe dans la nouvelle classe, mais cela nécessitera un code standard. AOP peut fournir un moyen de le faire plus simplement, en utilisant quelque chose comme PostSharp (avec un filtre personnalisé).

0

Oui, vous pouvez le faire si je vous comprends bien ici le msdn article on alias namespacing

est ici la magie

using colAlias = System.Collections 

donc je suis aliasing System.Collections sous mon propre espace de noms.

est ici l'exemple

using colAlias = System.Collections; 
namespace System 
{ 
    class TestClass 
    { 
     static void Main() 
     { 
      // Searching the alias: 
      colAlias::Hashtable test = new colAlias::Hashtable(); 
     // Add items to the table. 
     test.Add("A", "1"); 
     test.Add("B", "2"); 
     test.Add("C", "3"); 

     foreach (string name in test.Keys) 
     { 
      // Seaching the gloabal namespace: 
      global::System.Console.WriteLine(name + " " + test[name]); 
     } 
    } 
} 

}

0

classes wrapper WRT, je trouve beaucoup de fois que les gens enveloppent les classes seulement pour étendre la fonctionnalité, au lieu d'utiliser que d'exprimer une est-une relation. Dans ces cas, vous pouvez considérer Extension Methods.

Cela vous permet d'écrire des méthodes pour des classes existantes au lieu de dériver simplement pour ajouter plus de fonctionnalités. Par ex.

/// <summary> 
/// ICollectionExtensions 
/// </summary> 
internal static class ICollectionExtensions 
{ 
    public static void AddNew<T>(this ICollection<T> self, T data) 
    { 
     if (self != null && !self.Contains(data)) 
     { 
      self.Add(data); 
     } 
    } 
} 

Ensuite, vous pouvez .AddNew() sur ICollection<T> types.

0

Pas sûr de ce que vous essayez d'accomplir, mais jetez un oeil à AutoMapper également.

1

Vous pouvez hériter de la classe:

namespace N2 
{ 
    public class Class1 : N1.Class1 
    { } 
} 
+0

ou même partager une interface. +1 – nawfal