Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

8 réponses
Avatar
Sébastien Pertus
Bonjour =E0 tous,

Je cr=E9e un object qui h=E9rite de CollectionBase :

/// CODE C# ///

public class CATs : CollectionBase
{
...
}

/// FIN CODE C# ///

Dans cette class, j'ai donc des propri=E9t=E9s et des m=E9thodes.

Probl=E8me : Je veux impl=E9menter la propri=E9t=E9 Item qui me
renvoit l'item correspondant de la liste de ma collection
(de type CAT)

En VB, j'aurais fais (=E7a 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) =3D Value
End Set
End Property

/// FIN CODE VB ///


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

/// CODE C# ///

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

/// FIN CODE C# ///

Et =E7a, =E7a ne fonctionne pas ... Erreur =E0 la compilation.

Quelqu'un aurait une id=E9e ?
Merci d'avance.

PS : Pour l'instant, j'arrive =E0 impl=E9menter une m=E9thode qui
me renvoit un objet de type CAT ( get_CAT(){...} ), puis
une m=E9thode qui remplit la liste ( set_CAT(){...} ) mais =E7a
ne me plait gu=E8re :)

Merci =E0 tous

S=E9bastien Pertus
sebastien[A-RO-BAZ]midiway.fr

8 réponses

Avatar
Fabrice MALAINGRE
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
Avatar
Sébastien Pertus
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


.



Avatar
Fabrice MALAINGRE
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
Avatar
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à :)
Avatar
Boris Sargos
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.
Avatar
Fabrice MALAINGRE
> 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
Avatar
Sébastien Pertus
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


.



Avatar
Boris Sargos
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.