Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Shadow en C# - comment "changer" le type d'une propriété dans une classe dérivée
Dans certains projet on aimerait bien pouvoir changer le type d'une propriété. Je pense notamment dans le cas ou vous faites un site en asp.net, le premier reflexe est de créer ses propres Pages, UserControle et MasterPage en dérivant des controles de base !
 
Mais ce qui serait bien c'est que dans vos UserControles la propriété page soit du type MonProjet.Web.UI.Page plutot que System.Web.UI.Page
 
voici l'astuce qui permet justement de "changer" de changer le type de la propriété tout en gardant le meme nom :

namespace monProjet.Web.UI
{
       public class UserControl : CSLib.Web.UI.UserControl 
      {
               public virtual new monProjet.Web.UI.Page Page
               {
                       get { return (monProjet.Web.UI.Page)base.Page; }
               }
       }
}

Maintenant dans vos UC la propriété page sera du type MonProjet.Web.UI.Page =)

Pour ceux qui font du VB.net :

Namespace monProjet.Web.UI
    
        Public Class UserControl
                Inherits CSLib.Web.UI.UserControl

                Public Shadows ReadOnly Property Page() As monProjet.Web.UI.Page
                        Get
                             Return CType(MyBase.Page, monProjet.Web.UI.Page)
                       End Get
                End Property

        End
Class

End
Namespace

 

Posted: samedi 11 février 2006 00:53 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Nurgle a dit :

C'est pas bête du tout ça ! :)
En plus, je pense qu'on peut faire pareil avec la valeur de retour d'une fonction par exemple...

ça m'a donné des idées ça, je sens que je vais bien m'amuser :D
# février 11, 2006 09:47

coq a dit :

Attention tout de même avec cette technique là, ça peut s'avérer dangereux.
En effet la propriété/méthode "masquante" ne sera appelée que si l'instance est typée du type qui la définit.
Ce ne sera pas le cas lors d'un appel en étant typé avec le type de base, ce qui, par exemple, est le cas par défaut des collections de contrôles.
En gros si jamais vous utilisez cette technique pour "enrichir" une valeur, vous pouvez aller vers quelques problèmes.


Exemple, ça sera plus parlant : j'enrichis ici la propriété Name, héritée de la classe de base Control (oui, totalement inutile mais bon, ça fait un exemple :p)


public partial class UserControlPerso : UserControl
{
public new string Name
{
get
{
return string.Format("Mon nom est {0}", base.Name);
}

set
{
base.Name = value;
}
}
}

...


foreach (Control ctrl in this.Controls)
{
// Affichera "userControlPerso1"
MessageBox.Show(ctrl.Name);
}



=> Alors qu'en typant "correctement" :

foreach (Control ctrl in this.Controls)
{
string name = null;

if (ctrl is UserControlPerso)
{
// appel direct à UserControlPerso.Name : Affichera "Mon nom est userControlPerso1"
name = ((UserControlPerso)ctrl).Name;
}
else
{
name = ctrl.Name;
}

if ( name != null )
MessageBox.Show(name);
}
# février 11, 2006 11:19

Nurgle a dit :

ok, mais qu'est ce qui se passerais si on parcourait des interfaces :

Si Control et UserControlPerso implémentent tous les deux une interface, par exemple, IPropertyName qui les oblige à avoir une propriété Name.

Si avec un foreach je parcours tous les IPropertyName qui se trouvent dans une collection de Control (qui peut donc contenir aussi des userControlPerso car userControlPerso hérite de Control) et que j'affiche leur propriété Name, je vais avoir quoi : "userControlPerso1" ou "Mon nom est userControlPerso1" ???

En gros, qu'est ce qui se passerais si j'affiche la property Name d'un userControlPerso contenu dans une Collection de Control, si je parcours la collection avec IPropertyName et pas avec Control ?? (je sais pas si c'est très clair comme question...lol)
# février 11, 2006 11:58

coq a dit :

Pour notre exemple :

Si UserControlPerso l'implémente, ça sera la propriété Name définie dans UserControlPerso.

Si une classe de base de UserControlPerso l'implémente et pas UserControlPerso, ça sera la propriété Name de la classe de base en question.

Et finalement si à la fois UserControlPerso et une ou plusieurs de ses classes de base implémentent l'interface, tu vas te retrouver avec quelque chose du genre "Mon nom est Mon nom est [...] userControlPerso1", mais ceci est dû à l'utilisation de base.Name dans le code.
Sans cet effet boule de neige, ce serait la propriété de la classe (implémentant l'interface) la plus élevée dans la pile d'héritage qui verrait sa propriété appelée.
# février 11, 2006 12:34

Nurgle a dit :

:D
merci coq !
j'ai tout compris maintenant :)
# février 11, 2006 13:49

cyril a dit :

Ce que dit coq est trés interessant :) j'avais oublié ce "point" de détail vu sur le bouquin de Richard : Au coeur de VB.net
# février 11, 2006 14:03
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01