2010-05-10 10 views
3

Mise à jour du commentaire:Comment puis-je étendre une classe LINQ-to-SQL sans avoir à effectuer de modifications à chaque fois que le code est généré?

Je dois étendre les classes LINQ to SQL par les propres paramètres et ne veulent pas que toucher les classes générées. Toutes les meilleures suggestions sont les bienvenues. Mais je ne veux pas non plus recommencer toutes les affectations d'attributs si les classes linq-to-sql sont en train de changer. donc si VStudio génère un nouvel attribut à une classe que j'ai mes propres attributs étendus maintenus séparés, et le nouveau innerited de la classe elle-même


question d'origine:

je ne suis pas sûr que ce soit possible. J'ai une voiture de classe et une classe mycar prolongée de la voiture de classe. Class mycar a aussi une liste de cordes. Seule différence.

Comment est-ce que je peux lancer maintenant n'importe quel objet de voiture à un objet mycar sans assigner tous les attributs chacun à la main. Comme:

Car car = new Car(); 

MyCar mcar = (MyCar) car; 

ou

MyCar mcar = new MyCar(car); 

ou cependant je peux étendre voiture avec des variables propres et ne pas faire toujours

Car car = new Car(); 
MyCar mcar = new MyCar(); 
mcar.name = car.name; 
mcar.xyz = car.xyz; 
... 

Merci.

+0

Cela semble faux, devrait être l'inverse, sinon, pourquoi voudriez-vous lancer une voiture à MyCar? –

+0

Parce que j'ai besoin d'étendre les classes linq-to-sql par leurs propres paramètres et ne veux pas toucher les classes générées. Toutes les meilleures suggestions sont les bienvenues. Mais je ne veux pas non plus recommencer toutes les affectations d'attributs si les classes linq-to-sql sont en train de changer. donc, si vstudio génère un nouvel attribut dans une classe, j'ai mes propres attributs étendus séparés, et le nouveau innerited de la classe elle-même. – csharpnoob

+0

@csharpnoob - J'ai ajouté le contenu de votre commentaire à la question pour vous aider à trouver la meilleure solution pour ce problème particulier sans vous embourber dans les trucs de la POO. – cjk

Répondre

16

En réponse à votre commentaire sur la question, les classes Linq-To-Sql sont générées comme partielles. Cela signifie que vous pouvez avoir des fichiers de code séparés avec les mêmes noms de classes déclarés comme partiels pour ajouter les propriétés supplémentaires que vous voulez.

E.g.Votre Ling-To-Sql classe de concepteur sera:

public partial class Car 
{ 
    .... lots of auto generated stuff .... 
} 

Vous pouvez avoir votre propre fichier séparé (dans le même projet) appelé Car.cs:

public partial class Car 
{ 
    public MyCustomStuff{ get; set; } 
} 

Et les deux classes seront fusionnés ensemble. Assurez-vous simplement qu'ils sont dans le même espace de noms.

+0

c'est pourquoi je crée une nouvelle classe et étend la classe linq. La seule chose qui manque est comment mettre maintenant les données dans les nouveaux objets sans assigner tous les attributs manuels dans le constructeur. – csharpnoob

+1

Vous n'avez peut-être pas compris la réponse de ck. Si vous définissez ce qui suit: public partiel classe Voiture { public Liste MyProperty1 {get; ensemble; } } Vous aurez exactement ce que vous vouliez. Vous ne modifiez pas la classe générée, vous l'étendez sans la sous-classer.Pensez aux classes générées par WinForms, puis vous écrivez vos propres personnalisations dans un fichier séparé qui est assemblé au moment de la compilation. –

+0

+1. Les classes générées, comme les classes linq2Sql, ne doivent pas être dérivées pour ajouter des fonctionnalités. Ils devraient être cloués sur l'utilisation partielle de sorte que vous n'avez pas besoin de faire face à des maux de tête de sous-classe. –

1

vous ne pouvez pas définir définitivement un Car comme MyCar parce qu'il n'y a aucune garantie que le Car est un MyCar. Vous pouvez essayer la distribution et voir si cela fonctionne, ou vous pouvez utiliser le mot-clé as pour essayer la distribution et obtenir la valeur null si elle échoue.

Comment les propriétés sont-elles définies dans Car? Pourquoi ne peut pas MyCar juste utiliser la même technique pour définir ses propriétés? Après tout, c'est un Car. Pourquoi voulez-vous créer un MyCar à partir d'un Car? Pourquoi ne pas simplement créer un MyCar en premier lieu?

Vous pouvez aussi créer un constructeur dans MyCar qui prend une Car et affecter les propriétés de MyCar à ceux de Car dans le constructeur.

Vous pouvez également envisager d'utiliser le decorator pattern comme une alternative à subclassing, et que votre délégué MyCar les appels à la enveloppées Car

+0

merci beaucoup pour votre commentaire. voir mon commentaire dans la question. il s'agit d'obtenir des données dans l'objet innerited de linq-à-sql – csharpnoob

+0

ok. vous devriez vraiment avoir posé la question que vous vouliez répondre, pas une autre question connexe. aurait sauvé tout le monde un certain temps. –

+0

Pourquoi? La question ne pointe-t-elle pas vers une solution possible? C'est juste un peu plus général? – csharpnoob

2

Vous pouvez créer un constructeur de copie d'accepter un paramètre de classe de base dans la classe dérivée:

class MyCar { 
    public MyCar(Car car) { 
     name = car.name; 
     // etc 
    } 
} 
0

Il y a plusieurs options que vous pouvez utiliser:

  • implicit or explicit opérateur
    public static explicit operator Car(MyCar source)

  • un constructeur de copie
    public MyCar(Car source)

  • une méthode d'extension
    public static class CarExtensions {
    public static MyCar Create(this Car source) }