[RÉSOLU] [MY-AL] convertir une string en un autre type avec le type étant une variable

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
bricolomagnac
Messages : 67
Inscription : 09 Déc 2018 00:51
Localisation : France
Contact :

[RÉSOLU] [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par bricolomagnac » 17 Oct 2022 02:42

Bonjour, je sais qu'il existe un sujet similaire "Acceder à une variable par la valeur d'une String" dans Archives Javascript mais mon problème est différent, il réside dans la conversion de string au type choisi,

voici la ligne qui pose problème:

Code : Tout sélectionner

myFieldInfo.SetValue(lescript, Convert.ChangeType(découpage[repèr + 3], myFieldInfo.GetType()));
pour des questions de lisibilité et de facilité à débugger on peut la diviser en chacun de ses composants:

Code : Tout sélectionner

Type le_type_sible = myFieldInfo.GetType();
string la_string = découpage[repèr + 3];
var potato = Convert.ChangeType(la_string, le_type_sible);
myFieldInfo.SetValue(lescript, potato);
et à ce moment là on voit que le problème est à la troisième ligne, lors de la conversion, Voici l'erreur:
InvalidCastException: Value is not a convertible object: System.String to System.Reflection.MonoField
ça échoue à convertir une string contenant "7" en un int de valeur "7"

pour résoudre ce problème j'ai essayé:
- de remplacer .GetType() par .PropertyType
- de remplacer Convert.ChangeType par Convert.ToType
- de remplacer var potato = Convert.ChangeType(la_string, le_type_sible); par var potato = string la_string; potato.SetType(le_type_sible);
- et probablement d'autres tentatives dont je n'ai pas gardé de trace,
et rien ne marches.

Est-ce que quelqu'un aurait une idée de comment résoudre le problème?
je sais que je peux faire ça de manière un peu brute force avec des if, mais je garde ça en dernier recours.

Merci d'avance pour vos réponses.
Dernière édition par bricolomagnac le 18 Oct 2022 20:02, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par Max » 17 Oct 2022 13:24

Bonjour,

peux-tu fournir la définition de SetValue(string, ??) ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
bricolomagnac
Messages : 67
Inscription : 09 Déc 2018 00:51
Localisation : France
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par bricolomagnac » 17 Oct 2022 14:20

SetValue c'est d'après ce que j'ai compris pour définir la valeur d'une variable dans un script, le myFieldInfo contient les informations de la variable, et dans la commande SetValue on renseigne le script cible ici "lescript" et la nouvelle valeur à donner à notre variable, ici "potato".
c'est un peu comme faire "lescript.la variable_à_modifier = potato;" sauf que là c'est dynamique on peut à l'aide d'une string dynamiquement choisir le nom du script, et le nom de la variable.

sauf que comme je l'ai dit le problème est à l'étape de conversion,
-j'ai une valeur contenu dans la_string
-j'ai le type de variable que je souhaite avoir dans le_type_sible (par exemple: int, float, vector3, etc)
-et avec ça je veux donc obtenir une nouvelle variable "potato" avec le contenu de la_string et le type le_type_sible

faut juste convertir la string la_string en le type indiqué par la variable le_type_sible.
Dernière édition par bricolomagnac le 17 Oct 2022 22:49, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par Max » 17 Oct 2022 14:43

myFieldInfo est donc une propriété si je suis se que tu dis, et donc on parle bien de cela.

Donne un script d'exemple le plus complet possible, cela sera bien plus facile que des explications textuelles.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
bricolomagnac
Messages : 67
Inscription : 09 Déc 2018 00:51
Localisation : France
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par bricolomagnac » 17 Oct 2022 23:20

myFieldInfo est donc une propriété si je suis se que tu dis, et donc on parle bien de cela.
oui mais la partie du code pour définir la valeur fonctionne c'est celle pour convertir qui pose problème, je ne vois pas bien le lien

en tout cas voici mon script d'exemple:

Code : Tout sélectionner

using System;
using System.Linq;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class exenple171022 : MonoBehaviour
{

	[Tooltip("inscrivez ici le nom de l'objet cible")]
	public string S_objet;
	[Tooltip("inscrivez ici le nom du script au quelle vous voulez accéder")]
	public string S_lescript;
	[Tooltip("inscrivez ici le nom de la variable que vous voulez modifier")]
	public string S_variable;
	[Tooltip("inscrivez ici la valeur que vous souhaitez attribuer à la variable")]
	public string la_string;
	
	
	void Start ()
	{
		GameObject lobjet = GameObject.Find(S_objet);
		Debug.Log(lobjet.ToString() + " trouvé");
		
		Component lescript = lobjet.GetComponent(S_lescript);
		Type myClassType = lescript.GetType();
		Debug.Log(myClassType + " trouvé");
		
		FieldInfo myFieldInfo = myClassType.GetField(S_variable);
		Debug.Log(myFieldInfo + " trouvé, et sa valeur est: " + myFieldInfo.GetValue(lescript));
	
		Type le_type_sible = myFieldInfo.GetType();
		var potato = Convert.ChangeType(la_string, le_type_sible);
		Debug.Log("conversion effectué");
		
		myFieldInfo.SetValue(lescript, potato);
		Debug.Log(myFieldInfo + " modifié, sa nouvelle valeur est: " + myFieldInfo.GetValue(lescript));
		
	}
}	

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par Max » 18 Oct 2022 08:49

ton soucis vient que tu cherches à récupérer le type sur myFieldInfo, et non sur sa valeur.
Quand tu fais Type le_type_sible = myFieldInfo.GetType() il te renvoi FieldInfo, normal.

Il faudrait pour moi plutôt écrire quelque chose comme:

Code : Tout sélectionner

		var element = myFieldInfo.GetValue(lescript);
		Type le_type_sible = element.GetType();// myFieldInfo.GetType();
		var potato = Convert.ChangeType(la_string, le_type_sible);
		Debug.Log("conversion effectué");
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
bricolomagnac
Messages : 67
Inscription : 09 Déc 2018 00:51
Localisation : France
Contact :

Re: [MY-AL] convertir une string en un autre type avec le type étant une variable

Message par bricolomagnac » 18 Oct 2022 14:14

ah mais oui, ça paraît évident maintenant!
merci oh vénérable grand sage de Unity :amen:
je vais essayer de retrouver où est-ce que j'ai trouvé cette mauvaise information de faire myFieldInfo.GetType(), après c'est probablement moi qui ait dû rater un détail et qui en suis venu à écrire ça...

Répondre

Revenir vers « Scripting »