Propriétés en C# sur un objet collection

Le
Sébastien Pertus
Bonjour tous,

Je cre un object qui hrite de CollectionBase :

/// CODE C# ///

public class CATs : CollectionBase
{

}

/// FIN CODE C# ///

Dans cette class, j'ai donc des proprits et des mthodes.

Problme : Je veux implmenter la proprit Item qui me
renvoit l'item correspondant de la liste de ma collection
(de type CAT)

En VB, j'aurais fais (a marche d'ailleurs)

/// CODE VB ///

Public Property Item(ByVal index As Integer) As CAT
Get
Return CType(List.Item(index), CAT)
End Get
Set(ByVal Value As CAT)
List.Item(index) = Value
End Set
End Property

/// FIN CODE VB ///


Donc en C# je fais donc (et c'est l que ca coince):

/// CODE C# ///

public CAT Item(Int32 index)
{
get
{
return((CAT)this.List[index]);
}
set
{
this.List[index] = value;
}
}

/// FIN CODE C# ///

Et a, a ne fonctionne pas Erreur la compilation.

Quelqu'un aurait une ide ?
Merci d'avance.

PS : Pour l'instant, j'arrive implmenter une mthode qui
me renvoit un objet de type CAT ( get_CAT(){} ), puis
une mthode qui remplit la liste ( set_CAT(){} ) mais a
ne me plait gure :)

Merci tous

Sbastien Pertus
sebastien[A-RO-BAZ]midiway.fr
Vos réponses
Trier par : date / pertinence
Fabrice MALAINGRE
Le #12419161
Bonjour Sébastien,

En C#, il faut inplémenter l'opérateur "[]" :

//============================ public CAT this[int index]
{
get
{
return((CAT) this.List[index]);
}
set
{
this.List[index] = value;
}
} // [] operator

//============================
Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Sébastien Pertus
Le #12419141
Bonjour Fabrice,
J'aurais du indiquer que j'ai déjà implémenter un indexeur
sur ma class ...
Désolé de ne pas l'avoir précisé :)

Le fait est que je voudrais arriver à la solution

Admettons une class où j'instancie ma collection

CATs oCats = new CATs;
//En passant par l'indexeur
oCats[2].MaPropriete
//En passant par Item (que je n'arrive pas à créer)
oCats.Item[2].MaPropriete

Voilà ce à quoi je veux arriver

Merci de la première réponse rapide :)



-----Message d'origine-----
Bonjour Sébastien,

En C#, il faut inplémenter l'opérateur "[]" :

//======================== =====
public CAT this[int index]
{
get
{
return((CAT) this.List[index]);
}
set
{
this.List[index] = value;
}
} // [] operator

//======================== =====

Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr


.



Fabrice MALAINGRE
Le #12419131
Bonjour Sébastien,

J'aurais du indiquer que j'ai déjà
implémenter un indexeur sur ma class ...


Heu ! Il me semble qu'un indexeur C# est justement l'équivalent de la
propriété Item de VB !!!
Voir :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vbcon/html/vbtskChoosingDefaultPropertyOrMethodForClass.asp

CATs oCats = new CATs;
//En passant par l'indexeur
oCats[2].MaPropriete
//En passant par Item (que je n'arrive pas à créer)
oCats.Item[2].MaPropriete
Voilà ce à quoi je veux arriver


Simple question de candide qui ne connait pas le contexte de votre projet :
La syntaxe via l'indexeur n'est pas suffisante ?

Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Le #12419121
J'ai indiqué Item comme exemple car "ça parle plus" comme
démonstration.

En fait le problème c'est :

"Comment implémenter une propriété qui peut prendre un
paramètre (ou index) en entrée"

exemple
Comment faire :

public Tobject MAPROPRIETE(Int32 ParamInt)
{
get{return((Tobject)OtherObject);}
set{OtherObject=value;}
}

Sans être obliger de faire deux functions

public Tobject get_MAPROPRIETE(Int32 ParamInt)
{
return(...);
}

public void set_MAPROPRIETE(Tobject myObject, Int32 ParamInt)
{
...
}


Voilà :)
Boris Sargos
Le #12419101
Salut Sébastien,

permets-moi d'intervenir, car tout n'est pas clair dans ta demande.
La première chose qui me soit venue à l'esprit, c'est "pourquoi
n'utilise-t-il pas simplement des fonctions ? Les propriétés ne sont que
des fonctions particulières qui prennent la valeur de la propriété en
paramètre. L'indexeur [] est à mes yeux une surcharge de l'opérateur []
et non une propriété. Donc, utilise des fonctions.

Par ailleurs, dans ton code :
public Tobject MAPROPRIETE(Int32 ParamInt)
{
get{return((Tobject)OtherObject);}
set{OtherObject=value;}
}


le paramètre "ParamInt" n'apparaît nulle part dans la définition de tes
accesseurs. Tout ceci n'est pas clair...

Boris.
Fabrice MALAINGRE
Le #12419091
> En fait le problème c'est :
"Comment implémenter une propriété
qui peut prendre un paramètre
(ou index) en entrée ?"



A ma connaissance, en C# c'est impossible :-(
Mis à part l'indexeur bien sûr...

Codialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Sébastien Pertus
Le #12419021
Tu as tout a fait raison, c'est impossible :
Pour ceux que ça intéresse :

Sujet MSDN :
ms-help://MS.MSDNQTR.2003FEB.1036/csref/html/vclrfIndexedPropertiesPG.htm

Ca y est j'ai trouvé :

ms-help://MS.MSDNQTR.2003FEB.1036/csref/html/vclrfIndexedPropertiesPG.htm
(lien vers la doc msdn)

Je cite :

Citation :

Le type d'un indexeur et chacun des types référencés dans
la liste formal-index-parameter-list doivent être au moins
aussi accessibles que l'indexeur lui-même. Pour plus
d'informations sur les niveaux d'accessibilité, consultez
Modificateurs d'accès.
La signature d'un indexeur est composée du nombre et des
types de ses paramètres formels. Elle n'inclut pas le type
de l'indexeur ni les noms des paramètres formels.
Si vous déclarez plusieurs indexeurs dans la même classe,
ils doivent avoir des signatures différentes.
Une valeur d'indexeur n'est pas classée en tant que
variable ; elle ne peut donc pas être passée en tant que
paramètre ref ou out.
Pour fournir à l'indexeur un nom que les autres langages
peuvent utiliser pour la propriété indexée par défaut,
utilisez un attribut name dans la déclaration. Exemple :

Code :

<pre>[System.Runtime.CompilerServices.CSharp.IndexerName("MyItem")]
public int this [int index] // Indexer declaration
{
}</pre>


Cet indexeur portera le nom MyItem. Si vous ne spécifiez
pas l'attribut name, le nom par défaut est Item.


L'explication se trouve là :

Citation :
Pour fournir à l'indexeur un nom que les autres langages
peuvent utiliser pour la propriété indexée par défaut,
utilisez un attribut name dans la déclaration.


Et par défaut c'est Item. Donc ca ne sert à rien et Vb
l'affiche par défaut alors que c# non.

D'ailleurs reflector, pour l'ArrayList, remonte ça :

Code :

public virtual object this[int index] { get; set; }



Et dans la liste des propriétés, on trouve :

Code :

Item[Int32] : Object



et si on affiche les détails de la propriété, on a :

Code :

public virtual object this[int index]
{
get
{
...
}
set
{
...
}
}


Comme quoi, ça valait bien la peine d'en discuter :)

Merci à vous deux pour votre aide :)

Sébastien

_____________________________________


-----Message d'origine-----
En fait le problème c'est :
"Comment implémenter une propriété
qui peut prendre un paramètre
(ou index) en entrée ?"



A ma connaissance, en C# c'est impossible :-(
Mis à part l'indexeur bien sûr...

Codialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr


.



Boris Sargos
Le #12419001
Fabrice MALAINGRE a écrit :
En fait le problème c'est :
"Comment implémenter une propriété
qui peut prendre un paramètre
(ou index) en entrée ?"




A ma connaissance, en C# c'est impossible :-(
Mis à part l'indexeur bien sûr...

Codialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr




Oui, c'est bien ça : une fonction.
Publicité
Poster une réponse
Anonyme