2014-10-08 75 views
-1

作爲一個背景位,我有一個使用VB.net作爲中間人的.net <-> COM object bridge,並且有很多反射來完成工作。使用CallByName設置Item(x)屬性

我碰到的地方,我需要使用CallByName一道坎()來設置它被定義爲

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

這通常被稱爲.Object(1) = "new value"一個非常標準的屬性,但是橋碼此刻嘗試將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") 

對於陣列類型的屬性,參數(S)被傳遞給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")