2010-03-24 11 views
0

Dans ma demande, j'ai une classe qui a des propriétés de types définis par l'utilisateur comme celui-ci:comment puis-je obtenir par exemple de la propriété

class MyType 
{ 
    public A MyProperty 
    { 
     get; 
     set; 
    } 
} 
class A 
{ 
    .....some methods and proeprties 
} 

pour certaines opérations que je dois effectuer de mon programme principal, je ont créé une liste de a et ajouter à elle MyProperty chaque fois la création objet de MyType

List<A> myList = new List<A>(); 

MyType m1 = new MyType(); 
myList.Add(m1.MyProperty); 

MyType m2 = new MyType(); 
myList.Add(m2.MyProperty); 

......more instances 

et le transmettre à mon programme principal et là j'effectuer une opération différente sur ces propriétés qui reflète là aussi des cas. Y at-il un moyen par lequel je pourrais obtenir l'instance de l'objet pour un MyProperty particulier de cette propriété dans la liste.

Répondre

1

Je suppose que vous voulez dire que vous créez un List<A> et que vous voulez être en mesure de savoir à partir d'une instance de A quelle instance de MyType "le possède". Il n'y a aucun moyen de le faire sans mettre l'information dans A (ou avoir une liste complète des instances de MyType et de les vérifier). Après tout, deux instances de MyType pourraient avoir le même A:

MyType first = new MyType(); 
MyType second = new MyType(); 
A a = new A(); 
first.MyProperty = a; 
second.MyProperty = a; 

Ce qui MyType est a logiquement associée à? Les deux ou aucun des deux, vraiment ...

La propre approche est de faire savoir A dont MyType il est associé explicitement - vous pouvez alors décider ce qui devrait se produire si vous essayez d'avoir une instance d'un associé à deux cas de MyType (devrait-il jeter une exception? Conserver les deux en tant que liste? Garder le plus récent?) Vous voulez probablement faire la mise à jour MyType.MyProperty la valeur qui est passée, pour garder l'association en synchronisation.

+0

désolé, j'ai tapé par erreur, j'ai plus tard mis à jour ma question – viky

1

La réponse la plus simple: utilisez Dictionnaire, pas Liste. Mais je pense que c'est moche. Ou mettre dans un référent parent interne.

class A:ICloneable 
{ 
    internal MyClass _parent; 

    public MyClass Parent 
    { 
     get 
     { 
      return this._parent; 
     } 
    } 

#region ICloneable Members 

    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

#endregion 

    .....some methods and proeprties 
} 

class MyType 
{ 
    private A _myProperty; 

    public A MyProperty 
    { 
     get 
     { 
       return this._myProperty; 
     } 
     set 
     { 
       this._myProperty = a.Clone(); 
       this._myProperty._parent = this; 
     } 
    } 
} 

Important! Read about MemberwiseClone Function

+0

On dirait bien, mais il y a quelques fautes de frappe: _myPropery. – Polyfun

+0

O! Merci. Édité. – Stremlenye

0

Toute raison pour laquelle vous ne pouviez pas le faire à la place: -

List<MyType> myList = new List<MyType>(); 

MyType m1 = new MyType(); 
myList.Add(m1); 

Et puis dans le programme principal, vous pouvez obtenir tous de la MyProperty du MyType plus vous auriez accès à toute information sur l'objet MyType dont vous pourriez avoir besoin.

L'idée est un peu semblable à cela ... Je vois souvent les développeurs à créer une méthode comme celui-ci

public void ProcessFoo(int idOfFoo){} 

puis plus tard ils ont besoin d'autres détails de l'objet Foo qu'ils ajoutent à la signature

public void ProcessFoo(int idOfFoo, string name){} 

la meilleure approche (à moins d'une certaine limitation bizarre) est passe juste dans l'ensemble de l'objet Foo en premier lieu ...

public void ProcessFoo(Foo foo){} 

hmmm bien j'hésite à donner des «conseils» supplémentaires sans plus de contexte. Je suis sûr que dans le contexte de ce que vous faites, c'est logique, mais cela me semble dangereux.

La réponse de Jon est très pertinente en ce qui concerne une instance de A pourrait être assignée à MyProperty de MyType, alors ce que vous dites est que l'instance de A pourrait également appartenir à MyPropertyX et MyPropertyY.

Désolé stremlenye mais quel est le but du clonage de l'objet? Pour moi il devrait y avoir une très bonne raison de créer une nouvelle instance séparée ... d'autant plus que le clonage est rarement bien mis en œuvre sur tous les objets sauf les plus simples (peut-être y a-t-il une bonne raison de l'exemple).

+0

pour certains types, je pourrais avoir plus d'une propriétés de type A – viky

+0

réponse modifiée ci-dessus ... commentaire n'a pas assez de caractères ... – wallismark