Variable in Funktionsaufrufen

Lil-rich

Erfahrenes Mitglied
Hallöchen,

da mir die Foren-Suche kein Ergebnis brachte, wollte ich einfach mal direkt fragen:
Wie rufe ich eine Funktion auf, die einen variablen Namen hat ?

Beispiel:
Dim e As String = "XYZ"

ABC.DEF.e.Select()

Wobei dann natürlich das "e" im Aufruf durch "XYZ" ersetzt werden soll. Geht das ? Wenn ja, wie ? (e kann ca. 15 verschiedene Werte haben, wodurch andere Möglichkeiten sehr sehr lang werden würden :( )
 
Was?

Beschreib mal bitte etwas genauer was du vor hast, ich verstehs noch nicht...

Variable Funktionsnamen die mit nem String erzeugt in Objekten werden find ich so auf die schnelle etwas seltsam...
 
Ok ^^ Kann ich verstehen, ich arbeite erst seit 3 Tagen mit VB.net, deshalb kann da manchmal was durcheinander kommen bei mir...

Ich hab im Script stehen:

Code:
Private Sub PoliceBackupCall(ByVal weapon As String)
                Passenger.Weapons.MP5.Select()
End Sub

Das "MP5" stellt die Variable dar... Die Zeile kann man mit verschiedenen Waffen aufrufen:

Code:
Private Sub PoliceBackupCall(ByVal weapon As String)
                Passenger.Weapons.MP5.Select()
End Sub

Private Sub PoliceBackupCall(ByVal weapon As String)
                Passenger.Weapons.GLOCK.Select()
End Sub

Private Sub PoliceBackupCall(ByVal weapon As String)
                Passenger.Weapons.M4.Select()
End Sub

und so weiter. Nun will ich aber die Variable "weapon" nutzen, anstatt dass die Waffe bei jedem Aufruf feststeht. Ich hoffe, ich habs nun besser erklärt ^^

Ich hatte mir das so gedacht:
Code:
Private Sub PoliceBackupCall(ByVal weapon As String)
                Passenger.Weapons.weapon.Select()
End Sub
Aber das geht ja leider nich...
 
Aaaahh jetzt ja! Was hältst du von der Idee die "Weapons" in ein Array zu schreiben und dann z.B. über

Code:
Passenger.Weapons["weaponName"].Select()

oder

Code:
Passenger.Weapons.Select("MP4")

anzusprechen.

Du solltest dir eine Weapon-Basisklasse anlegen und evtl. sogar ein Interface erstellen über das du die Objekte dann ansprechen kannst.
 
Code:
Passenger.Weapons["weaponName"].Select()
Wird wohl nicht funktionieren. Vielleicht wäre es wichtig gewesen, zu erwähnen, dass ich die "Struktur" nicht beeinflussen kann.
Passenger ist ein von mir erzeugtes Objekt, aber der Rest ist von mir nicht änderbar. Das sind vorgegebene Klassen/Methoden/Funktionen :(
Diese selbst zu schreiben ist eher schwierig realisierbar, da ich wie gesagt noch ziemlicher Anfänger in VB.net bin.

Code:
Passenger.Weapons.Select("MP4")
Das gibt mir einen Fehler:
System.NullReferenceException: Object reference not set to an instance of an object.
at RealityScript.PoliceBackupCall(String polModel, String copModel, Int32 Speed, Int32 cops, String weap)
at RealityScript.PoliceCallBackup()
at GTA.Script.ProcessBoundKey(Keys Key)
at GTA.Script.ProcessEvents()
at GTA.Script.DoTick()
at GTA.ScriptThread.OnTick()

Gibts denn keine einfachere Methode ? So wie in PHP, einfach "$$var" :) Das wäre schön...
 
Die Beispiele von M4st3r waren nur Vorschläge für eine Änderung an der Struktur. So wie es derzeit ist, ists ein wenig unbequem zu benutzen. ;)

Hier mal ein Vorschlag, der funktionieren sollte:
Code:
    Private weaponMap As New Dictionary(Of String, MethodInvoker)

    Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        weaponMap.Add("GLOCK", AddressOf  Passenger.Weapons.GLOCK.Select)
        weaponMap.Add("M4", AddressOf  Passenger.Weapons.M4.Select)
        weaponMap.Add("MP5", AddressOf  Passenger.Weapons.MP5.Select)
        REM hier die restlichen Waffen anfügen..

    End Sub

    Private Sub PoliceBackupCall(ByVal weapon As String)

        If weaponMap.ContainsKey(weapon) Then
            weaponMap(weapon).Invoke()
        End If

    End Sub

Du musst nur noch alle verfügbaren Möglichkeiten in diese weaponMap hinzufügen.

lg,.
 

Neue Beiträge

Zurück