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

时间:2011-02-01 06:54:14

标签: 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

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

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

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

如果还有其他方法,请建议

谢谢

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

This可以帮到你吗?