2010-05-07 2 views
2

Essentiellement, je dois utiliser un service Web mal mis en œuvre par d'autres programmeurs. Ils ont deux classes qui ne dérivent pas d'une classe parente, mais ont les mêmes propriétés (Ughh ...). il semble donc comme ça dans mon service web fichier de classe proxy:Quelle est une solution élégante pour obtenir les valeurs de propriété de deux classes (qui ont les mêmes noms de propriété) qui n'utilisent pas l'héritage?

public partial class Product1 
{ 
    public int Quantity; 
    public int Price; 
} 

public partial class Product2 
{ 
    public int Quantity; 
    public int Price; 
} 

Alors, quelle est la meilleure façon de saisir les valeurs des propriétés connues sans dupliquer le code? Je sais que je pourrais probablement utiliser la réflexion, mais cela peut devenir laid. S'il y a une façon plus simple et moins folle de le faire (peut-être dans les nouvelles fonctionnalités de C#), s'il vous plaît faites le moi savoir.

+0

Pouvez-vous changer les classes du tout? –

+0

Pouvez-vous ajouter du code dans les classes 'Product'? – tzaman

+0

Je pourrais probablement depuis ce que je fais est de créer une classe proxy à partir du service Web et l'utiliser, mais cela peut être difficile à maintenir comme si elles mettent à jour le service web et je recréer la classe proxy je dois me rappeler le changement Je l'ai fait et fait à chaque fois. – SlipToFall

Répondre

3

Je ne suis pas sûr que je comprends parfaitement votre situation, mais peut-être quelque chose comme ce? Définir une interface IProduct avec getQuantity et getPrice méthodes, et la mettre en œuvre dans les deux classes:

public partial class Product1 : IProduct 
{ 
    public int Quantity; 
    public int Price; 
    public int getQuantity() { return Quantity; } 
    public int getPrice() { return Price; } 
} 

Et de même pour l'autre; alors utilisez-les simplement comme IProduct.

+0

Désolé, je me suis rendu compte que je ne l'ai pas précisé et j'ai changé la question en conséquence. C'est un service web dont je n'ai pas le contrôle, mais que je dois utiliser. Sinon, j'aurais utilisé l'héritage comme un bon programmeur ou, mieux encore, je n'aurais pas deux classes séparées avec les mêmes propriétés. – SlipToFall

+0

Peu importe, je vois ce que vous dites. Le fait que ce soit une classe partielle aide parce que je peux modifier la classe dans mon propre code sans éditer le fichier proxy, complètement passé au-dessus. Merci. – SlipToFall

1

Mot clé dynamique dans 4.0? mais je ne dirais pas que c'est élégant, mais ça marchera.

+1

Alors que cela pourrait fonctionner, il ne devrait pas être utilisé comme une béquille pour un mauvais design, mais si c'est la seule solution qui reste alors je dirais que c'est un cran mieux que la réflexion. –

+0

Oui, je suis totalement d'accord avec vous sur ce point, c'est pourquoi j'ai dit que ce n'était pas élégant. – BartoszAdamczewski

+0

Tout mon travail a trait à un mauvais design. C'est vraiment frustrant, alors je ne suis pas sûr de ce que je peux faire d'autre. Je pourrais probablement dire aux gens de le changer, mais c'est une toute autre boîte de Pandore. Je suis sûr que ce serait la seule fois où je devrais l'utiliser. – SlipToFall

0

voici un pseudocode désolé pour ne pas travailler sur. Peut-être que cela vous donne la bonne direction:

List objects = new Liste(); objects.Add (p1); // votre premier objet produit objects.Add (p2); // votre deuxième objet produit

foreach (var o in objects)//go through all projects 
    { 

     if (o.GetType().Equals(typeof(Product1)) //check which class is behind the object 
      ((Product1)o).Price = 2; //convert to fitting class and call your property 
     //.... 
    } 
+0

pas sympa mais devrait fonctionner – MUG4N

2

Si les classes sont générées à partir d'un proxy Web, vous pouvez implémenter une classe partielle implémentant une interface commune.

De Proxy Gen:

public partial class Product1 { 
    public int Quantity; 
    public int Price; 
} 

public partial class Product2 { 
    public int Quantity; 
    public int Price; 
} 

écrit à la main:

public interface IProduct { 
    int Quantity { get; } 
    int Price { get; } 
} 

public partial class Product1:IProduct { 
    int IProduct.Quantity { get { return Quantity; } } 
    int IProduct.Price { get { return Price; } } 
} 

public partial class Product2:IProduct { 
    int IProduct.Quantity { get { return Quantity; } } 
    int IProduct.Price { get { return Price; } } 
} 

Maintenant vos deux classes implémentent IProduct et peut être passé autour de la même manière.