393 votes

Lancer une variable à l'aide d'une variable Type

En C # puis-je convertir une variable de type objet en une variable de type T où T est défini dans une variable Type?

267voto

Zyphrax Points 6603

Bien sûr, vous pouvez ici être à la fois un simple (supposons qu’il s’agisse d’une distribution de type T) et si c’est commode (supposons que nous puissions le convertir en un T) converti:

 public T CastExamp1<T>(object input) {   
    return (T) input;   
}

public T ConvertExamp1<T>(object input) {
    return (T) Convert.ChangeType(input, typeof(T));
}
 

8voto

Mehrdad Afshari Points 204872

Mettre boxing et unboxing de côté pour des raisons de simplicité, il n'y a pas d'exécution spécifique d'action impliqués dans la coulée le long de la hiérarchie d'héritage. C'est surtout un moment de la compilation chose. Essentiellement, un casting indique au compilateur de traiter la valeur de la variable d'un autre type.

Ce que vous pourriez faire une fois le plâtre? Vous ne connaissez pas le type, de sorte que vous ne seriez pas en mesure d'appeler une méthode sur elle. Il n'y aurait pas quelque chose de spécial que vous pourriez faire. Plus précisément, il peut être utile uniquement si vous connaissez les types possibles au moment de la compilation, de la lancer manuellement et traiter chaque cas séparément if déclarations:

if (type == typeof(int)) {
    int x = (int)obj;
    DoSomethingWithInt(x);
} else if (type == typeof(string)) {
    string s = (string)obj;
    DoSomethingWithString(s);
} // ...

4voto

Daniel Brückner Points 36242

Comment pouvez vous faire ça? Vous avez besoin d'une variable ou d'un champ de type T où vous pouvez stocker l'objet après la distribution, mais comment pouvez-vous avoir une telle variable ou un tel champ si vous ne connaissez T qu'au moment de l'exécution? Donc, non, ce n'est pas possible.

 Type type = GetSomeType();
Object @object = GetSomeObject();

??? xyz = @object.CastTo(type); // How would you declare the variable?

xyz.??? // What methods, properties, or fields are valid here?
 

-1voto

user2008563 Points 11
public bool TryCast<T>(ref T t, object o)
{
    if (
        o == null
        || !typeof(T).IsAssignableFrom(o.GetType())
        )
        return false;
    t = (T)o;
    return true;
}

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