2015-01-06 2 views
0

이것이 가능한지 확실하지 않지만 변수의 값을 객체의 멤버 이름으로 전달할 수 있어야합니다.변수를 멤버 이름으로 객체에 전달 하시겠습니까?

기본적으로 나는 그 중 일부가 컬렉션을 포함 할 수있는 많은 개체가있는 wdsl을 사용하고 있습니다. 데이터 그리드를 작성하여 컬렉션에 데이터를 표시해야하지만 지금 당장은 간단합니다. 얼마나 많은 효과적인 열과 그 이름과 유형을 정의하는 각 객체/콜렉션에 대한 코드를 작성하십시오.

이 긴 호흡이 조금이라도 잘 작동하지만, WDSL 변화와 개체를 수집 내용 변경 (이름, 유형 등)

내가해야 할 것은 개체 이름을 통과 할 수있을 것입니다 경우도 깰 것 객체에 콜렉션이 포함되어있는 경우 (PropertyType에는 [] 포함), 이름을 읽고 해당 이름을 올바른 레벨로 이동하여 "열"이름 및 데이터 유형을 검색하는 루프로 전달합니다 .

나는 아래 예제에서 CollName의 문자열 값을 분명히 평가하지 않기 때문에 객체 이름으로 루프에 콜렉션 이름을 전달하고자 할 때까지 거의 모든 작업을 수행 할 수 있습니다. CollName은 물론 객체의 멤버가 아니지만 실제 값이 될 변수입니다.

Sub IterateObject(objName) 
    Dim CollName = "" 
    For Each m As System.Reflection.PropertyInfo In objName.GetType().GetProperties() 
     If m.CanRead Then 
      If InStr(m.PropertyType.ToString, "[]") <> 0 Then 
       CollName = m.Name 
      End If 
     End If 
    Next 
    For Each p As System.Reflection.PropertyInfo In objName.CollName(2).GetType().GetProperties() 
     If p.CanRead Then 
      If p.Name <> "ExtensionData" Then 
       MsgBox(p.Name & " - " & (p.PropertyType.ToString)) 
      End If 
     End If 
    Next 
End Sub 

효과적으로 수행하는 방법이 있나요 objName.(value of CollName)(2).GetType().GetProperties()

+0

해달라고 필요 그것은 나를 그냥 비트에서 새 개체를 만들 수 있도록 CallByName을 사용하여 고정 된 것 같습니다 꽤 XY 문제를 따르고 의심 스럽지만 컬렉션 이름은 일반적으로 가치가 거의 없으며 컬렉션의 Type * in이 더 흥미로운 경향이 있습니다. 빈 컬렉션을 기반으로 유형을 구성 할 수는 있지만 오브젝트 (콜렉션 이름 아님)로 시작해야하며 콜렉션은 일반이어야합니다. grody VB 컬렉션의 arraylist는 아이템 유형에 대해 아무 것도 말하지 않을 것입니다 – Plutonix

+0

아마도 제가 잘 설명하지 않았으므로 예제를 드리겠습니다. 나는 "SrvRef.RetrieveActiveSupplyChainsResponse"와 같은 형식의 객체를 반환하는 wdsl의 메서드를 가지고 있는데, 객체 브라우저에서 {Length = 11} 같이 Array와 매우 유사한 "ActiveSupplyChains"까지 드릴 다운 할 수 있습니다.이 필드에는 필드가 들어 있습니다. 이름과 값이 인스턴스에 격자에 표시해야 할 11 결과가 있습니다. – Colster

+0

이제 배열/컬렉션 이름 ("ActiveSupplyChains")을 설정 했으므로 "ActiveSupplyChains"를 반복하여 필드 이름과 필드 유형을 가져와야합니다. 위 코드는 objName.ActiveSupplyChains (2) .GetType(). GetProperties()가 작동하지만 컬렉션 이름이 "ActiveSupplyChain"인 경우에만 멤버 이름을 명시 적으로 정의하면 올바르게 작동합니다. 내가 이것을 추출 할 수 있어야합니다 (첫 번째 반사 루프가 달성하고 두 번째 루프로 전달). – Colster

답변

0

이 내가

Sub IterateObject(objName) 
    Dim CollName = "" 

    For Each m As System.Reflection.PropertyInfo In objName.GetType().GetProperties() 
     If m.CanRead Then 
      If InStr(m.PropertyType.ToString, "[]") <> 0 Then 
       CollName = m.Name 
      End If 
     End If 
    Next 
    Dim CollObj 
    CollObj = CallByName(objName, CollName, CallType.Get) 
    For Each p As System.Reflection.PropertyInfo In CollObj(0).GetType().GetProperties() 
     If p.CanRead Then 
      If p.Name <> "ExtensionData" Then 
       MsgBox(p.Name & " - " & (p.PropertyType.ToString)) 
      End If 
     End If 
    Next 
End Sub 
관련 문제