2011-02-01 20 views
3

こんにちは 私は、私のクラスがユーザーが提供するVBコードを実行しなければならないプロジェクトに取り組んでいます。私は自分自身のeval関数を再作成しようとしています。コードの問題は、それがどんな変数やそこ値にアクセスすることができないということですので、私は、変数名を取得することを決定しました。このタスクVB.netで変数名の型と現在のクラスまたはメソッドの値を取得する方法は?

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 

は、そこに動的なタイプとそこタイプ値とそのクラスでそれらを再作成します動的に作成されています。

現在のクラスまたはメソッドで変数名を取得し、再作成してユーザーが渡したコードを実行できるようにする方法を提案してください。ユーザーは現在のクラスまたはメソッドの変数を知っていますデータ型がありますが、変更された可能性のある値はわからないため、初期化できません。

このコードは、page_loadイベントのasp.netページで呼び出されます。ユーザーが渡すコードは、パラメータとして渡される変数vbCodeに格納されます。これを行うための他の方法がある場合は

答えて

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 

注:これは唯一のパブリック変数のために働く

2

Thisはあなたを助けるかもしれないありがとう提案してください?

関連する問題