vb.net - 如何在 VB.net 中获取当前类或方法中的变量名称类型和值?

标签 vb.net reflection

嗨 我正在做一个项目,我的类(class)必须执行用户提供的 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

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

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

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

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

谢谢

最佳答案

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

使用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

注意:它只适用于公共(public)变量

关于vb.net - 如何在 VB.net 中获取当前类或方法中的变量名称类型和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859780/

相关文章:

c# - 检查 propertyInfo 是否实现了一个类

java - 通过反射获取非静态继承字段

c# - 为什么短路运算符不是默认值

mysql - 检查 MySQLReader 是否完成运行/查找记录 VB.Net

c# - 将 VB.net 代码与 C# 代码混合

java - getDeclaredMethods() 和隐藏的父类(super class)静态方法

reflection - 获得反射。结构类型

.net - 在 PropertyGrid 中设置只读属性将所有属性设置为只读

.net - 在查询中多次使用相关实体

c# - .NET 应用程序和性能监控