Si vous pensez que la réponse que vous avez dit que vous avez trouvé:
Type t = Type.GetType(element.Attribute("castToType").Value);
MethodInfo castMethod = this.GetType().GetMethod("CastTo", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(t);
object castedObject = castMethod.Invoke(this, new object[] { objectToCast });
ne fait quelque chose, alors vous ne comprenez pas ce que signifie la coulée.
Le type de temps de compilation est toujours object
, donc vous n'avez rien gagné. Vous pouvez directement lancer n'importe quoi comme object
directement.
La conversion ne change pas le type d'un objet, elle indique seulement au compilateur que vous savez de quel type il s'agit et que le compilateur vous croira. Si vous avez tort, une erreur se produira encore, seulement au moment de l'exécution avec un InvalidCastException
au lieu de la compilation.
Le problème est que le transtypage vers un type qui n'est pas connu au moment de la compilation n'a tout simplement aucun sens. Même si vous pouviez hypothétiquement, qu'est-ce que cela vous donnerait?
Type someType = Type.GetType("castToTypeNameHere");
someType o = CastTo<someType>(objectToCast);
Quelles sont les méthodes o
ont? someType
pourrait être quelque chose, donc il n'y a aucun moyen le compilateur peut savoir quelles méthodes ou des propriétés qu'il a, ce serait exactement la même chose que
object o = (object)objectToCast
Parce qu'il n'y a rien que vous pourriez faire avec someType
que vous ne pouviez pas avec object
.
Pourriez-vous expliquer pourquoi vous voulez faire 'o = CastTo (obj);' quand vous pouvez simplement utiliser 'o = (t) obj;' s'il vous plaît? –
@Kieren: Vous ne pouvez pas utiliser 'CastTo (obj)' ou '(t) obj' dans l'exemple donné car' t' est une instance 'Type', pas un nom de type. –
LukeH
@Kieren, vous ne pouvez pas faire ni '(t) obj;' ni 'CastTo', d'où la question. –