2

私は Reflection に精通しているわけではありませんが、クラス プロパティの値を取得するために、数日間このコードに取り組んできました。プログラムVisualCronによって管理されるcronジョブ内の値を見つけるためにAPIを使用しています。

構造を少し説明します。各 cron ジョブには、独自の設定を持ついくつかのタスクが含まれています。設定は、次のように宣言された TaskClass クラス内のプロパティに格納されます。

Public Property <propertyname> As <classname>

各プロパティは独自のクラスに関連付けられているため、たとえば、次のように宣言された TaskClass 内に Execute プロパティがあります。

Public Property Execute As TaskExecuteClass

TaskExecuteClass の内部には、必要な値を保持するプロパティがあります。以下のコード ブロックで、文字列を除くすべての型のプロパティ値を取得できました。偶然にも、取得する必要がある値は文字列値だけです。

何度も何度も検索しても同様の問題を抱えている人を見つけることができないため、これを引き起こしているのは私が書いたものに何か問題があるに違いないことを私は知っています. 誰でも私を助けてもらえますか?

Dim strAdd As String = ""
For Each t As VisualCronAPI.Server In vcClient.Servers.GetAll()
  For Each f As VisualCron.JobClass In t.Jobs.GetAll
    For Each s As VisualCron.TaskClass In f.Tasks
      Dim propVal As Object
      Dim propInfo As PropertyInfo() = s.GetType().GetProperties()
      For i As Integer = 0 To propInfo.Length - 1
        With propInfo(i)
          If s.TaskType.ToString = propInfo(i).Name.ToString Then
            Dim asm As Assembly = Assembly.Load("VisualCron")
            Dim typeName As String = String.Format("VisualCron.{0}", propInfo(i).PropertyType.Name)
            Dim tp As Type = asm.GetType(typeName)
            Dim construct As ConstructorInfo = tp.GetConstructor(Type.EmptyTypes)
            Dim classInst As Object = construct.Invoke(Nothing)
            Dim classProps As PropertyInfo() = classInst.GetType().GetProperties()
            For h As Integer = 0 To classProps.Length - 1
              With classProps(h)
                If .GetIndexParameters().Length = 0 Then
                  propVal = .GetValue(classInst, Nothing)
                  If Not propVal Is Nothing Then
                    strAdd = f.Name & " - " & s.Name & " - " & .Name & " - " & propVal.ToString
                  End If
                End If
                If strAdd <> "" Then
                  ListBox1.Items.Add(strAdd)
                End If
              End With
            Next
          End If
        End With
      Next
    Next s
  Next f
Next t
4

1 に答える 1

0

くだらない方法ではありますが、私は自分の問題を解決しました。これはおそらく信じられないほど非効率的ですが、私の特定のケースでは速度は必要ありません。動作するコードは次のとおりです。

Dim strAdd As String = ""
For Each t As VisualCronAPI.Server In vcClient.Servers.GetAll()
  For Each f As VisualCron.JobClass In t.Jobs.GetAll
    For Each s As VisualCron.TaskClass In f.Tasks
      Dim propVal As Object
      Dim propInfo As PropertyInfo() = s.GetType().GetProperties()
      For i As Integer = 0 To propInfo.Length - 1
        With propInfo(i)
          If s.TaskType.ToString = propInfo(i).Name.ToString Then
            Dim asm As Assembly = Assembly.Load("VisualCron")
            Dim typeName As String = String.Format("VisualCron.{0}", propInfo(i).PropertyType.Name)
            Dim tp As Type = asm.GetType(typeName)
            Dim construct As ConstructorInfo = tp.GetConstructor(Type.EmptyTypes)
            Dim classInst As Object = construct.Invoke(Nothing)
            Dim classProps As PropertyInfo() = classInst.GetType().GetProperties()
            For h As Integer = 0 To classProps.Length - 1
              With classProps(h)
                If .GetIndexParameters().Length = 0 Then
                  propVal = .GetValue(CallByName(s, propInfo(i).Name.ToString, [Get]), Nothing)
                  If Not propVal Is Nothing Then
                    If propVal.ToString.Contains("\\server\") Or propVal.ToString.Contains("\\SERVER\") Then
                      strAdd = f.Name & " - " & s.Name & " - " & .Name & " - " & propVal.ToString
                      ListBox1.Items.Add(strAdd)
                    End If
                  End If
                End If
              End With
            Next
          End If
        End With
      Next
    Next s
  Next f
Next t

違いを生んだコードは、

classProps(h).GetValue(CallByName(s, propInfo(i).Name.ToString, [Get]), Nothing)

ライン。

このコードを改善するための提案があれば - ここにはまだ多くの間違いがあると思います - この回答の将来の閲覧者のためにコメントしてください。この作品の。

于 2012-11-30T17:28:44.020 に答える