2009-09-07 7 views
0

Si vous examinez la propriété DataGridViewTextBoxCell, ValueType, dans le réflecteur, vous pouvez voir qu'elle remplace une propriété de DataGridViewCell. La chose étrange est, est que la propriété overriden est readonly, mais la propriété dans la classe parent est en lecture et en écriture. Je ne peux que présumer que la propriété a été ombrée et que le réflecteur ne réfléchit pas ... erm ..Substitution de propriété étrange dans DataGridViewTextBoxCell

Est-ce exact? Eta: Je regarde la source, dans le réflecteur, comme vb.net.

Répondre

1

Le CLR implémente des propriétés en interne en tant que méthodes. Il y aura une méthode pour chaque acesseur. Donc, si votre propriété est en lecture/écriture, vous aurez deux méthodes. Si votre méthode est en lecture seule ou en écriture seule, vous n'aurez qu'une seule méthode.

Vous pouvez voir cela par vous-même en utilisant Reflector si vous choisissez IL au lieu de Visual Basic.


.method public hidebysig specialname virtual instance class [mscorlib]System.Type get_ValueType() cil managed 

Si vous comapre avec la méthode ToString ...


.method public hidebysig virtual instance string ToString() cil managed 

... vous remarquerez que les deux commencent par ".Méthode".

Puisque vous avez deux méthodes, vous pouvez les remplacer indépendamment les unes des autres.

+0

Je n'ai jamais réalisé qu'il était possible de remplacer un seul des accesseurs ... c'est bon à savoir! Cependant, je trouve cela plutôt déroutant, car la propriété surchargée semble être en lecture seule même si ce n'est pas ... –

+0

Je suis encore un peu confus. Je comprends qu'une déclaration de propriété est traduite en 2 méthodes mais, dans vb.net au moins, il n'est pas possible de surcharger une propriété en lecture et en écriture et de surcharger simplement le get - du moins pas sans le mot-clé shadows. – Jules

+0

Ouais ... Vous avez raison. Hier, je l'ai testé avec C# et comme cela fonctionnait, j'ai supposé que cela fonctionnerait aussi sur VB.NET. Maintenant, je l'ai essayé sur VB.NET mais je n'ai pas trouvé un moyen de le faire fonctionner. La solution de contournement serait de mettre un setter qui accède à l'accesseur de base. –