Как получить имена переменных типов и значения в текущем классе или методе в VB.net? - PullRequest
3 голосов
/ 01 февраля 2011

Привет Я работаю над проектом, в котором мой класс должен выполнять код 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, передаваемой в качестве параметра.

Если есть какой-либо другой способ сделать это, пожалуйста, предложите

Спасибо

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Я наконец нашел решение, как получить переменные и значения текущего экземпляра класса.

с использованием 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

Примечание: работает только для открытых переменных

2 голосов
/ 01 февраля 2011

Это может вам помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...