2010-05-18 4 views
2

J'ai un System.Collections.Generic.Dictionary<System.Web.UI.Control, object> où toutes les clés peuvent être de type System.Web.UI.WebControls.HyperLink ou System.Web.UI.WebControls.Label.Où() avec Replace() dans Dictionary.Where (p => p.Key est T)

Je veux changer Text propriété de chaque contrôle. Parce que HyperLink ne met pas en œuvre (pourquoi ?!) ITextControl, je dois jeter l'étiquette ou HyperLink explicitement:

Dictionary<Control,object> dic = .. 

dic 
    .Where(p => p.Key is HyperLink) 
    .ForEach(c => ((HyperLink)c).Text = "something") 

dic 
    .Where(p => p.Key is Label) 
    .ForEach(c => ((Label)c).Text = "something") 

Y at-il des façons de contourner cette approche?

Répondre

3

Vous pouvez créer une classe dérivée de HyperLink et laisser votre classe hériter de ITextControl. Devrait être clair où aller à partir de là ...

5

Un peu plus élégant, mais en conservant le problème:

foreach (HyperLink c in dic.Keys.OfType<HyperLink>()) 
{ 
    c.Text = "something"; 
} 

foreach (Label c in dic.Keys.OfType<Label>()) 
{ 
    c.Text = "something"; 
} 
+0

Est-ce vraiment un problème, cependant? –

+1

@Isaac Cambron: Il itère la collection deux fois et effectue beaucoup de vérifications de type, donc je dirais que c'est un peu moche. Mon vote porte sur la solution de @Stefan Egli. – dtb

2
dic.ForEach(c => c.Key.GetType() 
    .GetProperty("Text") 
    .SetValue(c.Key, "Something",null)); 

bidouille Total, probablement pas efficace, mais il devrait fonctionner ....

EDIT: Une autre chose intéressante à mentionner , si vous utilisez .Net 4, vous pouvez utiliser le typage du canard:

dic.ForEach(kvp => ((dynamic)kvp.Key).Text = "Something"); 
+1

Mutuelle? Oui. Plus rapide? À peine. – abatishchev

+1

@abat - ... ou en d'autres termes "probablement pas efficace" –

+1

-1 Pas un bon moyen :( –

2

De cette façon, semble plus laid et bancals, mais au moins vous êtes seulement sur le dictionnaire énumérant une fois:

dic 
    .ForEach(
    c => { 
     var clink = c as Hyperlink; 
     if (clink != null) { 
     clink.Text = "something"; 
     return; 
     } 

     var clabel = c as Label; 
     if (clabel != null) { 
     clabel.Text = "something"; 
     return; 
     } 
    } 
); 
0

À moins que le texte est une propriété de Contrôle, il est plus clair si vous le spécifiez dans des instructions séparées. Je n'essaierai pas de les combiner simplement parce qu'ils utilisent tous deux le mot «Texte» pour définir la propriété.

1

Identique à la réponse de Dan Tao - juste pour un minimum de maladresse.

foreach(Control c in dic.Keys) 
{ 
    HyperLink clink = c as Hyperlink; 
    if (clink != null) 
    { 
    clink.Text = "something"; 
    continue; 
    } 

    Label clabel = c as Label; 
    if (clabel != null) 
    { 
    clabel.Text = "something"; 
    continue; 
    } 
}