2010-01-29 6 views
0

J'ai un composant qui a une collection d'objets (DataProviders). Chaque DataProvider a un nom unique défini par l'utilisateur au moment du design. Comment puis-je demander au concepteur de générer une classe dans un fichier supplémentaire contenant les noms des DataProviders?Générer une classe personnalisée au moment du design

namespace MyNamespace 
{ 
public class DpContainer : Component 
{ 
public DataProviderCollection collection = new DataProviderCollection(); 

    private void InitializeComponent() 
    { 
     DataProvider dataprovider1 = new DataProvider(); 
     dataprovider1.Name = "Provider 1"; 

     DataProvider dataprovider2 = new DataProvider(); 
     dataprovider2.Name = "Provider 2"; 

     collection.add(dataProvider1); 
     collection.add(dataProvider2); 
    } 
    } 
} 

La classe générée devrait ressembler à ceci:

namespace DataProviderNamespace 
{ 
    public class DataProviderNames 
    { 
    public const string Provider1 = "Provider 1"; 
    public const string Provider2 = "Provider 2"; 
    } 
} 

Je voudrais ajouter cette classe en tant que fichier designer.cs. Utiliser CodeDom Je suis capable de créer cette classe, mais malheureusement je dois spécifier le chemin complet du fichier. De plus, je voudrais rendre la classe partielle. Comment puis-je faire ceci?

Répondre

1

Je ne sais pas si cela répond à vos besoins, mais avez-vous consulté Text Template Transformation Toolkit (T4)? Nous l'avons utilisé pour générer du code pour les composants d'accès aux données. Livré avec VS donc ce n'est pas quelque chose d'additionnel que vous auriez à acheter.

0

Ok. J'ai trouvé une solution (en utilisant DTE): dans la méthode Serialize de CodeDomSetializer custom:

IDesignerSerializationManager manager; 
EnvDTE._DTE dte = (DTE) manager.GetService(typeof(DTE)); 

de DTE j'obtenir le nom de fichier du document réel:

dte.ActiveDocument.FullName 

Maintenant je projet en cours:

ProjectItem proj = (ProjectItem)manager.GetService(typeof(ProjectItem)); 

et ajouter le nouveau fichier au projet:

proj.ProjectItems.AddFromFile(NewFile); 
Questions connexes