2014-10-08 6 views
-1

약간의 배경 지식으로 VB.net을 중개자로 사용하는 .net <-> COM object bridge을 가지고 있습니다. 내가 CallByName을 사용할 필요가있어 장애물로 실행 한 CallByName을 사용하여 Item (x) 속성을 설정하는 방법

()가

일반적으로 .Object(1) = "new value"로 호출 할 것이다
Public Default Property Item ( 
     index As Integer 
    ) As String 
     Get 
     Set 

으로 정의된다 꽤 표준 속성을 설정하는

그러나 다리 코드 그 순간에 .Object (1)을 객체로 가져오고 CallByName()을 사용하여 Set을 호출합니다 (분명히 작동하지 않음).

다른 콜렉션에서는 CallByName()을 사용하여 .Clear().Add("new value") 메서드 호출을 할 수 있지만이 속성에는 이러한 메서드가없고 게다가 좀 더 일반적인 방법으로 코드를 해결하려고합니다. 다리의 다른 쪽에서는 .Object라고 직접 부를 수 있습니다.

누군가가 CallByName()을 사용하여 직접 배열 유형 속성을 설정하거나이를 구현하기 위해 호출 할 수있는 대체 리플렉션 함수를 제안 할 수 있습니까?

답변

2

기본 속성은 이름을 사용하여 일반 속성으로 사용할 수 있습니다. 설정시

배열 형 속성에 대한
Dim Bar As New Foo 
    Bar(1) = "x" 
    Bar.Item(1) = "x" 
    CallByName(Bar, "Item", CallType.Set, 1, "x") 

, 매개 변수 (들) 값 앞에 CallByName에 전달됩니다

Class Foo 
    Default Public Property Item(index As Integer) As String 
     Get 
      '... 
     End Get 
     Set(value As String) 
      '... 
     End Set 
    End Property 
End Class 

이 세 가지 속성 할당을 모두 같은 효과를 : 그래서, 클래스를 제공 .

2

해당 속성에 CallByName을 어떻게 사용했는지 표시하지 않았으므로 잘못된 것을 추측 할 수 있습니다. .Object(1) = "new value"의 구문도 약간 혼란 스럽습니다. 선도 점은 Object 자체가 다른 유형의 컬렉션 일종이라는 것을 의미합니까?

기본적인 대답은 선언을 보는 것이지, 정상적으로 사용되는 방법이 아닙니다. 당신이 기본이다 일반적으로 때문에 "항목"을 생략 할 수 있다는 사실은, 여기에 적용되지 않습니다

'foo(1) ==> foo.Item(1) = "Ziggy" ==> 
CallByName(foo, "Item", CallType.Set, 1, "Ziggy") 

procName 인수는이 경우 속성 이름, Item 될 것이다. CallType.Set은 소품 세터 (Let 또는 Set가 모두 작동하는 것)를 원한다는 것을 의미합니다. 첫 번째 인수는 설정/가져올 항목의 인덱스이고, 마지막 인수는 전달할 데이터입니다. .Object 만약

는 당신이 컬렉션 속성을 참조하려고 뜻하고, 그 대답에 대해 동일합니다

'foo.bars(1) ==> foo.Bars.Item(1) = "Zoey" ==> 
CallByName(foo.Bars, "Item", CallType.Set, 1, "Zoey") 
관련 문제