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 :)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
//============================ 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
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
.
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
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
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
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
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
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à :)
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)
{
...
}
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
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.
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...
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
> 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
> 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
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
.
Tu as tout a fait raison, c'est impossible :
Pour ceux que ça intéresse :
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
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
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.
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