如何在VB.net中获取当前类或Method中的变量名类型和值?

Vam*_*msi 3 vb.net reflection

嗨,我正在开发一个项目,我的类必须执行用户提供的VB代码,使其变得简单我正在尝试重新创建我自己的eval函数,我使用下面的代码,我在网上找到这个任务

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
Run Code Online (Sandbox Code Playgroud)

代码的问题在于它无法访问任何变量或值,因此我决定动态获取变量名称,值类型和类型,并在动态创建的类中重新创建它们.

请建议一种方法来获取当前类或方法中的变量名称类型和值,以便我可以重新创建它们,并执行用户传递的代码,用户知道当前类或方法中的变量以及数据类型但是他不知道有什么价值,因为他们可能已经改变了,所以他无法初始化它们.

有没有办法做到这一点,这个代码将在page_load事件的asp.net页面中调用,用户传递的代码存储在作为参数传递的变量vbCode中.

如果还有其他方法可以做到这一点,请建议

谢谢

Vam*_*msi 6

我终于找到了如何获取类的当前实例的变量和值的解决方案.

使用System.Reflection;它很容易实现,所有你必须写的是以下行:

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
Run Code Online (Sandbox Code Playgroud)

注意:它仅适用于公共变量