Wie kann VB.NET einen String zugewiesen werden?

8

Betrachten Sie folgenden Code:

%Vor%

Ich habe eine Zeichenfolge namens S1 deklariert. Jetzt möchte ich S1 einen neuen Wert zuweisen. Der neue Zeichenfolgenwert wird in einer Datei im folgenden Format gespeichert: [Variablenname] [= als Trennzeichen] [Zeichenfolgenwert] . Wie weise ich den Wert S1 nach dem Abrufen des Namens und des Werts der Zeichenfolgevariablen zu, die in einer Datei gespeichert sind?

HINWEIS:

%Vor%

Es sollte beachtet werden, dass die Zeichenfolge mit den Daten aus einer Datei stammt, die sich von Zeit zu Zeit ändern kann! Wenn sich die Datei ändert, möchte ich auch die Variablen ändern.

Weitere Klarstellung

Ich brauche einen Code, der bei der Verarbeitung einer solchen Zeichenfolge "S1 = Hallo" zuerst eine deklarierte Variable (d. h. S1) findet und dann die Variable S1 mit der Zeichenfolge "Hallo" verknüpft. Das "=" diente nur als Trennzeichen für Variablenname und Variablenwert.

AKTUALISIEREN :

Mein Versuch, Mathias Lykkegaards Lorenzens EDIT 2-Beispiel zu verwenden, scheiterte jedoch mit "NullReferenceException" in dieser Zeile "Field.SetValue(Me, VariableValue)" . Bitte helfen Sie mir, das Problem zu beheben. Nachfolgend ist mein Code basierend auf Mathias Lykkegaard Lorenzens EDIT 2 Beispiel:

%Vor%     
Pan Pizza 29.04.2012, 11:22
quelle

7 Antworten

6

Sie können reflection verwenden, um den S1-Wert festzulegen:

%Vor%

Zusätzliche Ressource

Es gibt ein Buch über Reflektion, das sehr gut ist, schaut es euch an:

Visual Basic .NET-Reflektionshandbuch

  

Reflection ist ein von .NET bereitgestellter Mechanismus, der es Entwicklern ermöglicht   machen ihre Programme flexibler und dynamischer. Reflexion macht es   möglich für Anwendungen modularer, erweiterbar und   konfigurierbar. Aufbauend auf den Grundlagen der Objektorientierung und der   .NET-Typ-System, Reflektion bietet Mechanismen für dynamisch   Objekte untersuchen, ändern und sogar zur Laufzeit erstellen. .NET auch   fügt den Programmierern die Möglichkeit hinzu, ihren Typen Attribute hinzuzufügen,   welche Metadaten über den Typ bereitstellen, der untersucht und verwendet werden kann   durch Reflexion zur Laufzeit.

     

Dieses Buch untersucht alle Möglichkeiten, wie Reflektion verwendet und identifiziert werden kann   praktische Anwendungen und wichtige Programmiertechniken   nach Reflexion für ihre Funktionalität. Es umfasst die Reflektions-API,   die Verwendung von Attributen in .NET, und schaut auch auf die Mechanismen .NET   sorgt für die dynamische Generierung von Code - alle Techniken, die es erlauben   Entwickler, um flexiblere, dynamische Anwendungen zu erstellen.

    
Teen 02.05.2012, 07:39
quelle
3

Wenn ich Ihre Frage richtig verstanden habe, möchten Sie den Wert von temp(1) der lokalen Variablen mit dem gleichen Namen wie dem Wert von temp(0) zuweisen. Wenn Ihre Datei also S1=hello , S2=world enthält, möchten Sie, dass Ihr Code der Variablen S1 (und "world" der Variablen S2 "Hallo" zuweist, wenn eine solche Variable existiert).

Leider unterstützt Visual Basic nicht die Zuweisung von Werten an lokale Variablen, deren Namen zur Laufzeit festgelegt werden. Wenn S1 ein Klassenfeld oder eine Eigenschaft wäre, könnten Sie es mithilfe von reflection zuweisen eine Serialisierungsbibliothek (z. B. XmlSerializer , die jedoch Eingabedateien erwartet im XML-Format anstelle von Name = Wert-Paaren).

Im Allgemeinen wäre ein bisschen mehr Kontext erforderlich, um die beste Alternative für Ihre Situation vorzuschlagen. Wenn Sie beispielsweise nur die Namen S1 , ..., S20 haben, würde ich ein Array . Wenn Ihre Schlüssel willkürliche Namen sind, ist möglicherweise ein Wörterbuch geeigneter.

    
Heinzi 29.04.2012 11:37
quelle
3

Ich hoffe, ich bekomme die Frage richtig. Es scheint mir, als ob Sie den Wert von temp(1) der Variablen S1 zuweisen möchten, die Sie früher deklariert haben.

Dies geschieht mit einer einfachen Operation:

%Vor%

Oder wenn das für Sie nicht klar ist, kann auch Set verwendet werden:

%Vor%

Weitere Informationen zu diesem hier und hier .

Bearbeiten 1

Wenn Sie über das, was Sie gerade als Kommentar zu Ihrer Frage geschrieben haben, nachdenken, stammt die Zeichenfolge, die Sie aufteilen, aus einer Datei, die sich zu einem bestimmten Zeitpunkt ändern kann.

Dafür würde ich entweder eine Datenbank (mit Triggern) oder eine FileSystemWatcher (Dokumentation hier ), um ein bestimmtes Verzeichnis für Dateiänderungen zu überwachen.

Eine Beispiellösung, die dies verwendet, ist unten gezeigt.

%Vor%

Und dann in Ihrem Event-Handler:

%Vor%

Bearbeiten 2

Wenn Sie in der Lage sein möchten, den Wert einer Variablen anhand des Namens dieser Variablen als string zu ändern, sollten Sie sich Reflection ansehen, mit der Sie Code zur Laufzeit und nicht zur Kompilierzeit auswerten können .

Ich habe Ihnen einen Beispielcode gegeben, der die Verwendung von Reflection ziemlich genau beschreibt.

%Vor%     
quelle
2

Während Sie mit der Eigenschaft LocalVariables der Klasse Reflection.MethodBody auf die lokalen Variablen einer Methode zugreifen können, gibt es keine gute Möglichkeit, die Werte festzulegen, da die Variablennamen nirgendwo gespeichert werden. Sie können also nicht durch Reflektion nach Variablennamen suchen. Sie können die lokalen Variablen nach ihrem Index / Typ aufzählen, aber es gibt keine definitive Möglichkeit zu sagen, welche Variable welche ist, außer dass Sie vorher die genaue Reihenfolge kennen, in der sie deklariert sind (in diesem Fall können Sie nach Index gehen).

Weitere Informationen zu dem, was ich im msdn-Thema sage, finden Sie hier:

MethodBody.LocalVariables-Eigenschaft

Wenn Sie sowieso lokale Variablen über Reflektion suchen müssen, dann ist das ein absolut schlechtes Design und Sie sollten mehr an diesem Teil arbeiten (Refactoring Ihres Codes). Sie sollten vermeiden, Reflektion wo immer möglich zu verwenden, da es große Gemeinkosten hat und extrem langsam ist. Der Dictionary / SortedDictionary-Ansatz ist ein viel besserer Weg, um in der Situation zu gehen, in der Sie sich befinden.

    
Pradeep Kumar 09.05.2012 02:23
quelle
2

Sie können eine lokale Variable nicht reflektieren, da der Compiler nach der Kompilierung die Namen von Locals verliert, aber Namen für diese auf Klassenebene verwaltet.

Damit Ihr Beispiel funktioniert, müssen Sie S1 als Klassenvariable definieren, nicht als interne Variable für die Methode.

%Vor%

Wie schon gesagt, ist ein viel pragmatischerer Ansatz jedoch ein Wörterbuch.

%Vor%

Wenn Sie ein Wörterbuch hätten, das bereits die Werte enthält, nach denen Sie gesucht haben, würden Sie natürlich keine Addition durchführen, Sie würden nur den Schlüssel auf den neuen Wert setzen wie test(temp(0)) = temp(1)

Woran Sie denken müssen ist, dass Reflektion teuer ist. Tu es nicht, wenn du es nicht unbedingt tun musst. In diesem Fall kann ich nicht sehen, was wirklich nötig ist, und ich habe nichts gesehen, was mich davon überzeugt hätte, dass du keine andere Wahl hast. Versuchen Sie, Ihre Lösung so einfach wie möglich zu halten.

    
pms1969 03.05.2012 13:27
quelle
0

Wenn Sie Ihre Variablen einem Schlüsselwörterbuch von Variablen hinzufügen, können Sie set verwenden, um den Wert des Werts im Schlüsselwertpaar festzulegen. Sieh dir das an:

%Vor%     
Mike Calvert 08.05.2012 15:12
quelle
-2

Wenn Sie nur den Wert von temp(1) zu S1 zuweisen möchten, können Sie das tun:

%Vor%

Wenn Sie einen kleinen, festen Satz möglicher Werte haben, könnten Sie versuchen, Select Case :

zu verwenden %Vor%

Aber im Allgemeinen ist dies am besten, wenn Sie ein Wörterbuch verwenden, um die Werte zu speichern, nicht Variablen:

%Vor%

Sie können den Wert von S1 dann wie folgt abrufen:

%Vor%     
svick 29.04.2012 11:58
quelle