2014-10-08 4 views
-1

В качестве фона, у меня есть .net <-> COM object bridge, который использует VB.net как посредника, с большим количеством отражений, чтобы выполнить эту работу.Использование CallByName для установки свойства Item (x)

Я бежал в препятствие, где я нуждающегося использовать CallByName(), чтобы установить довольно стандартное свойство, которое определяется как

Public Default Property Item ( 
     index As Integer 
    ) As String 
     Get 
     Set 

, которые обычно называют .Object(1) = "new value", однако код моста на данный момент пытается получить .Object (1) в качестве объекта, тогда вызовите Set на нем, используя CallByName() (который явно не работает).

С другими коллекциями я с радостью могу использовать CallByName(), чтобы делать вызовы методов .Clear() и .Add("new value"), но это свойство не имеет этих методов и, кроме того, я хотел бы решить его для более общего подхода, чтобы код с другой стороны моста можно напрямую позвонить .Object.

Возможно ли кто-нибудь предложить способ установки свойства массива напрямую с помощью CallByName() или, возможно, предложить альтернативную функцию отражения, которая может быть вызвана для достижения этого?

ответ

2

Свойство по умолчанию может использоваться как обычное свойство, используя его имя. Таким образом, учитывая класс:

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

Эти три задания имущества все имеют один и тот же эффект:

Dim Bar As New Foo 
    Bar(1) = "x" 
    Bar.Item(1) = "x" 
    CallByName(Bar, "Item", CallType.Set, 1, "x") 

Для свойств массива типа, параметр (ы) передается CallByName до значения при настройке ,

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") 
Смежные вопросы