Comment faire pour attribuer de la valeur à l'aide de la chaîne VB.NET?
Envisager code suivant:
Dim S1 As String = "a"
'this is the string in a file
Dim StringFromFile As String = "S1=hello"
Dim temp() As String = Split(StringFromFile, "=", -1, CompareMethod.Binary)
'temp(0) = variable name
'temp(1) = variable value
'my question is: how to assign value to S1?
Je l'ai déclaré à une chaîne de caractères nommée S1. Maintenant, je veux affecter une nouvelle valeur à la S1. La nouvelle chaîne de valeur est stockée dans un fichier en utilisant le format suivant: [nom de la variable][= comme séparateur][chaîne de valeur]. Comment puis-je attribuer la valeur de S1 après la récupération de la chaîne de nom de variable et de valeur stockées dans un fichier?
REMARQUE:
temp(0) = "S1"
temp(1) = "hello"
Il convient de noter que la chaîne avec les données proviennent d'un fichier qui peut changer de temps à autre! Lorsque le fichier est modifié, je veux les variables de changer.
De plus amples éclaircissements
J'ai besoin d'un morceau de code que lors du traitement d'une chaîne comme celle-ci "S1=bonjour", le code va d'abord trouver une variable déclarée (c'est à dire S1), puis les affecter à la variable S1 avec la chaîne "hello". Le "=" juste agi comme séparateur pour le nom de la variable et la valeur de la variable.
Mise à JOUR:
Ma tentative d'utilisation de Mathias lykkegaard a Lorenzen s EDIT 2 exemple mais a échoué avec "l'exception NullReferenceException" sur cette ligne "Field.SetValue(Me, VariableValue)"
. Merci de m'aider à résoudre le problème. Voici mon code sur la base de Mathias lykkegaard a Lorenzen s EDIT 2 exemple:
Public Sub Ask()
Try
Dim S1 As String = "a"
Dim StringFromFile As String = "S1=hello"
Dim temp() As String = Split(StringFromFile, "=", -1, CompareMethod.Binary)
'temp(0) = variable name
'temp(1) = variable value
'my question is: how to assign value to S1?
Dim TypeOfMe As Type = Me.GetType()
'did this for readability.
Dim VariableName As String = temp(0)
Dim VariableValue As String = temp(1)
'get the field in the class which is private, given the specific name (VariableName).
Dim Field As FieldInfo = TypeOfMe.GetField(VariableName, BindingFlags.NonPublic Or BindingFlags.Instance)
'set the value of that field, on the object "Me".
Field.SetValue(Me, VariableValue) '<-- this line caused NullReferenceException
MessageBox.Show(S1)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
vérifier ma réponse - j'ai juste édité.
Bon, juste remarqué que vous souhaitez affecter des variables dynamiquement donné leur nom. Il y a une solution pour que, aussi, et je viens de modifier ma question de réfléchir.
Pizza à la poêle pls utiliser StringBuilder au lieu d'utiliser des Chaînes de caractères.
Je suis également d'avis qu'une table de hachage, dictionnaire, ou une autre clé=valeur de la paire de type de structure de données est une meilleure façon de gérer ces données.
OriginalL'auteur Pan Pizza | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la réflexion pour définir S1 valeur:
Ressources supplémentaires
Il y a un livre sur la réflexion qui est très bon, prenons un coup d'oeil:
Visual Basic .NET Réflexion Manuel
OriginalL'auteur Teen
Si j'ai bien compris votre question, vous voulez affecter la valeur de
temp(1)
à la variable locale avec le même nom que la valeur detemp(0)
. Donc, si votre fichier contient desS1=hello
,S2=world
, vous voulez que votre code d'assigner des "bonjour" à la variableS1
(et du "monde" pour la variableS2
, si cette variable existe).Malheureusement, Visual Basic ne prend pas en charge l'affectation de valeurs aux variables locales dont les noms sont déterminés au moment de l'exécution. Si
S1
ont été un champ de classe ou bien, vous pouvez l'assigner à l'aide de la réflexion ou une sérialisation de la bibliothèque (par exemple,XmlSerializer, qui cependant s'attend à ce que les fichiers d'entrée pour être en format XML plutôt que de paires nom=valeur).En général, un peu plus de contexte serait nécessaire pour vous proposer la meilleure solution pour votre situation. Par exemple, si vous avez des noms de
S1
, ...,S20
, j'utilise un tableau. Si vos clés sont arbitraires, des noms, un Dictionnaire pourrait être plus approprié.Je suis d'accord. Que downvote n'était pas très juste. La question n'est pas encore clair. Je lui ai donné un +1 pour la remettre sur les rails.
Merci!
OriginalL'auteur Heinzi
J'espère que je suis arriver le droit de la question. Il me semble que si vous voulez affecter la valeur de
temp(1)
à la variableS1
qui vous avez déclaré plus tôt.Cela se fait à l'aide d'une simple opération:
Ou, si cela n'est pas clair pour vous,
Set
peut être utilisé ainsi:Plus d'informations sur ce ici et ici.
Edit 1
Réfléchir sur ce que vous venez d'écrire un commentaire à votre question, la chaîne que vous fractionnez vient à partir d'un fichier qui peut changer à tout moment donné dans le temps.
Pour cela, je voudrais envisager à l'aide d'une base de données (avec des déclencheurs), ou un
FileSystemWatcher
(documentation ici) objet à surveiller un répertoire spécifique pour les modifications de fichiers.Un exemple de solution à l'aide de ce qui est indiqué ci-dessous.
Et puis, dans votre gestionnaire d'événement:
Edit 2
Si vous voulez être en mesure de modifier la valeur d'une variable donnée, le nom de cette variable comme un
string
, alors vous devriez regarder dans la Réflexion, ce qui permet d'évaluer de code lors de l'exécution, par opposition à la compilation.Je vous ai donné un exemple de code ci-dessous qui résume assez bien l'utilisation de la Réflexion.
Set
est VB6, il ne fait aucun sens .NET et en effet, l'IDE suffit de le retirer.Même en VB6 il n'était pas nécessaire. Je l'ai mis là entièrement pour qu'il puisse l'utiliser si il l'a trouvé pour être plus lisible.
+1, j'ai essayé votre exemple, Modifier 2 à l'aide de la réflexion, mais VS dit ""NullReferenceException" sur cette ligne ".SetValue(Moi, VariableValue)". Pouvez-vous veuillez élargir votre réponse?
Probablement parce que le champ n'a pas été trouvé. Il peut avoir été public, ou peut avoir été une variable locale et non pas une variable de classe, ou le nom est incorrect. Le BindingFlags attribut spécifie le type de champ doit être trouvé.
Non, c'est faux: VB6 nécessaire
Set
dans ces situations où il était valide. Il n'a pas besoinLet
, maisSet
pour objet la cession était obligatoire pour lever l'ambiguïté entre l'objet de cession ou implicite de la propriété par défaut d'affectation.OriginalL'auteur Mathias Lykkegaard Lorenzen
Alors que vous pouvez obtenir l'accès aux Variables Locales d'une méthode à l'aide de la
LocalVariables
Propriété de laReflection.MethodBody
classe, il n'y a pas de bonne façon de définir les valeurs, parce que les noms de variables ne sont pas stockées n'importe où. Donc vous ne pouvez pas recherche via la réflexion par des noms de variables. Vous pouvez énumérer les variables locales par leur index/type, mais il n'existe aucune façon de savoir quelles sont les variables qui, à l'exception que vous savez à l'avance l'ordre exact dans lequel elles sont déclarées (dans ce cas, vous pouvez passer par des index).Vous pouvez trouver plus d'informations à propos de ce que je dis dans la rubrique msdn ici:
MethodBody.LocalVariables Propriété
Si vous êtes de toute façon besoin pour la recherche de variables locales via la réflexion, puis il est absolument mauvaise conception et vous devez travailler plus sur cette partie (refactoring du code).
Vous devez éviter l'utilisation de la réflexion au total dans la mesure du possible, parce qu'il a des frais généraux importants et est extrêmement lent.
Le Dictionnaire/SortedDictionary approche est une bien meilleure façon d'aller dans la situation que vous êtes.
OriginalL'auteur Pradeep Kumar
Vous ne pouvez pas réfléchir une variable locale, car après la compilation, le compilateur perd les noms des habitants, mais conserve les noms de ceux au niveau de la classe.
Afin de rendre votre exemple, le travail, vous devez faire en S1, une classe de niveau variable, pas comme une variable interne à la méthode.
Toutefois, comme cela a déjà été dit ici, à avoir une approche plus pragmatique consiste à utiliser un dictionnaire.
si vous aviez un dictionnaire qui avait déjà les valeurs qui vous ont été après cela, tu ne ferais pas un complément de cours, vous serait tout simplement mettre la clé de la nouvelle valeur comme
test(temp(0)) = temp(1)
Ce que vous avez à retenir est que la Réflexion est cher. Ne pas le faire sauf si vous devez absolument. Dans ce cas, je ne vois pas le besoin réel pour elle, et j'ai rien vu à me convaincre que vous n'avez pas d'autre choix. Essayez de garder votre solution aussi simple que possible.
OriginalL'auteur pms1969
Si vous ajoutez vos variables d'un détrompeur dictionnaire des variables, vous pouvez utiliser le set pour définir la valeur de la valeur dans la Valeur de la Clé de paire. Check this out:
OriginalL'auteur Mike Calvert
Si vous ne souhaitez affecter la valeur de
temp(1)
àS1
, vous pouvez le faire:Si vous avez un petit ensemble fixe de valeurs possibles, vous pouvez essayer d'utiliser
Select Case
:Mais en général, la meilleure façon de le faire est d'utiliser un dictionnaire pour stocker les valeurs, pas de variables:
Ensuite, vous pouvez obtenir la valeur de
S1
par quelque chose comme:OriginalL'auteur svick