Donnerstag, Dezember 12, 2019

Wie man die Namen von Variablen, Typen, und Werte in die aktuelle Klasse oder Methode in VB.net?

Hi
Ich arbeite an einem Projekt, wo meine Klasse ist zum ausführen von VB-code durch den Benutzer bereitgestellt werden, es einfach zu machen ich versuche meine eigene eval-Funktion, ich bin mit dem folgenden code, den ich auf dem web gefunden werden, um diese Aufgabe

Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.IO
Namespace PAB.Util
Public Class EvalProvider
Public Function VS_Eval(ByVal vbCode As String) As Object
Dim c As VBCodeProvider = New VBCodeProvider
Dim icc As ICodeCompiler = c.CreateCompiler()
Dim cp As CompilerParameters = New CompilerParameters
cp.ReferencedAssemblies.Add("system.dll")
cp.ReferencedAssemblies.Add("system.xml.dll")
cp.ReferencedAssemblies.Add("system.data.dll")
' Sample code for adding your own referenced assemblies
'cp.ReferencedAssemblies.Add("c:\yourProjectDir\bin\YourBaseClass.dll")
'cp.ReferencedAssemblies.Add("YourBaseclass.dll")
cp.CompilerOptions = "/t:library"
cp.GenerateInMemory = True
Dim sb As StringBuilder = New StringBuilder("")
sb.Append("Imports System" & vbCrLf)
sb.Append("Imports System.Xml" & vbCrLf)
sb.Append("Imports System.Data" & vbCrLf)
sb.Append("Imports System.Data.SqlClient" & vbCrLf)
sb.Append("Namespace PAB  " & vbCrLf)
sb.Append("Class PABLib " & vbCrLf)
sb.Append("public function  EvalCode() as Object " & vbCrLf)
'sb.Append("YourNamespace.YourBaseClass thisObject = New YourNamespace.YourBaseClass()")
sb.Append(vbCode & vbCrLf)
sb.Append("End Function " & vbCrLf)
sb.Append("End Class " & vbCrLf)
sb.Append("End Namespace" & vbCrLf)
Debug.WriteLine(sb.ToString()) ' look at this to debug your eval string
Dim cr As CompilerResults = icc.CompileAssemblyFromSource(cp, sb.ToString())
Dim a As System.Reflection.Assembly = cr.CompiledAssembly
Dim o As Object
Dim mi As MethodInfo
o = a.CreateInstance("PAB.PABLib")
Dim t As Type = o.GetType()
mi = t.GetMethod("EvalCode")
Dim s As Object
s = mi.Invoke(o, Nothing)
Return s
End Function
End Class
End Namespace

Das problem mit dem code ist, dass er nicht Zugriff auf alle Variablen oder gibt es Werte, so habe ich beschlossen, um die Variablen-Namen, gibt es Werte, Typen und es gibt Typen, die dynamisch und erstellen Sie in der Klasse, die erstellt wird, dynamisch.

Bitte einen Weg vorschlagen, um die Variablen-Namen gibt es Typen, und Werte in die aktuelle Klasse oder Methode, so dass ich Sie neu erstellen, und führen Sie den Benutzer-code übergeben, der Benutzer weiß, was Variablen sind, die in die aktuelle Klasse oder Methode und es Datentypen, aber er weiß nicht, gibt es Werte, wie Sie geändert haben kann, so kann er nicht initialisieren.

Gibt es eine Möglichkeit, dies zu tun, dieser code wird aufgerufen, in einer asp.net Seite auf page_load-Ereignis den code übergeben, indem der Benutzer wird in der Variablen gespeichert vbCode, der als parameter übergeben wird.

Wenn es irgendeine andere Methode, dies zu tun, Sie schlagen

Danke

InformationsquelleAutor Vamsi | 2011-02-01

2 Kommentare

  1. 6

    Habe ich endlich die Lösung gefunden, wie man die Variablen und die Werte der aktuellen Instanz einer Klasse.

    mit System.Reflection; es ist sehr leicht zu erreichen, alles, was Sie schreiben, ist die folgende Zeile:

    Dim fields As FieldInfo() = Me.GetType().GetFields()
    For Each fld As FieldInfo In fields
    Dim name As String = fld.Name
    Dim value = fld.GetValue(Me)
    Dim typ As Type = fld.FieldType
    Next

    Hinweis : Es funktioniert nur für die public-Variablen

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...