2 votes

Effectuer un casting dans une boucle en utilisant Typeof

J'ai stocké dans un tableau les types de 2 objets que je passe en argument. J'essaie de les convertir dans une boucle mais cela ne semble pas fonctionner.
J'ai remarqué en déboguant que la valeur du Type de l'objet (retourné par key.GetType()), affiche Name=RunTimeType FullName=System.RuntimeType au lieu du Name=Label attendu.
Je ne suis pas sûr de ce que je fais de mal. Des suggestions?

public static void GetUserGUIDandSID(string username, Object b, Object c) { 
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain,
       "domainName.com");  
        UserPrincipal user = (UserPrincipal.FindByIdentity(ctx, username));
        var empIdNum = user.Guid.Value;
        var empSID = user.Sid.Value;

        List types = new List();
        types.Add(b.GetType());
        types.Add(c.GetType());

        foreach(var key in types) {
            if (key.GetType() == typeof(Label)) {
                ((Label)b).FontSize = 10;
                ((Label)b).Content = empIdNum;
            }
            if (key.GetType() == typeof(TextBox)) {
                ((TextBox)b).FontSize = 10;
                ((TextBox)b).Text = empIdNum.ToString();
            }
            if (key.GetType() == typeof(TextBlock)) {
                ((TextBlock)b).FontSize = 10;
                ((TextBlock)b).Text = empIdNum.ToString();
            }
        }
    }

3voto

Clemens Points 33376

Vous pouvez vérifier directement le type de chaque objet en utilisant l'opérateur is :

public static void GetUserGUIDandSID(string username, object b, object c)
{
    ...

    foreach (var o in new object[] { b, c })
    {
        if (o is Label)
        {
            ((Label)o).FontSize = 10;
            ((Label)o).Content = empIdNum;
        }
        else if (o is TextBox)
        {
            ((TextBox)o).FontSize = 10;
            ((TextBox)o).Text = empIdNum.ToString();
        }
        else if (o is TextBlock)
        {
            ((TextBlock)o).FontSize = 10;
            ((TextBlock)o).Text = empIdNum.ToString();
        }
    }
}

De plus, vous pouvez faire en sorte que la méthode accepte un nombre arbitraire d'objets en déclarant un argument params object[] :

public static void GetUserGUIDandSID(string username, params object[] objects)
{
    ...

    foreach (var o in objects)
    {
        ...
    }
}

Vous pouvez maintenant l'appeler avec différents nombres de paramètres d'objet, par exemple

GetUserGUIDandSID("utilisateur", a);
GetUserGUIDandSID("utilisateur", a, b);
GetUserGUIDandSID("utilisateur", a, b, c);

1voto

Gabor Marton Points 537

Pour OP :

Pourquoi ai-je changé cela if (key.GetType() == typeof(Label)) à cela if (key is Label)

Dans le premier cas, nous vérifions exactement le type Label. Autrement dit, si la clé est une instance de la classe dérivée de Label, le premier cas sera faux.

Par exemple, nous avons la classe personnalisée :

public class MonSuperLabel : Label
{
}

Le code suivant

var monLabel = new MonSuperLabel();
Console.WriteLine(monLabel.GetType() == typeof(Label));
Console.WriteLine(monLabel is Label);

Ecrira Faux pour le premier cas et Vrai pour le deuxième. L'opérateur is dans ce cas ne vérifie pas si les types sont égaux. Il vérifie la possibilité de caster l'instance donnée vers le type cible. Plus d'infos ici https://msdn.microsoft.com/en-us/library/scekt9xw.aspx.

De mon point de vue, dans votre cas particulier, is est meilleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X