2010-02-08 266 views
3

假設我有一個Excel.PivotField,並且需要在我的對象上設置HiddenItemsListNewLateBinding.LateSet反射調用

用VB.NET和Option Strict Off & Option Explicit Off這將導致:

Dim field as Excel.PivotField = MyFunctionCall()
field.HiddenItemsList = GetHiddenItems()

雖然這一點也適用此安全設置,它顯然不,當你設置Option Strict OnOption Explicit On工作。

IDE無法解析我的PivotField上的HiddenItemsList屬性(第一個問題)。

但是,當使用後期綁定,它完美的作品。

現在下一步是啓用Option Strict和Explicit(我們將來會轉換爲C#)。

所以我看的代碼是如何編譯:

NewLateBinding.LateSet(field , Nothing, "HiddenItemsList", New Object() { GetHiddenItems() }, Nothing, Nothing)
容易吧?

但是這段代碼依賴於Microsoft.VisualBasic命名空間。當然,我們不希望這樣。

所以,我試圖將其轉換爲一個普通的反射調用:

GetType(Excel.PivotField).GetProperty("HiddenItemsList").SetValue(field , GetHiddenItems() , Reflection.BindingFlags.SetProperty, Nothing, Nothing, Nothing)

不幸的是第一部分(GetType(Excel.PivotField).GetProperty("HiddenItemsList"))已經返回Nothing,所以我卡住了。

有幫助嗎? ;-)

回答

0

總是很高興回答你自己的問題。

由於GetType(Excel.PivotField).GetProperty("HiddenItemsList")返回無,我們需要另一種方法。

Type有一個方法,即InvokeMember,並且該方法具有正確的屬性!

下面是其他SO-ERS答案:d

GetType(Excel.PivotField).InvokeMember("HiddenItemsList", Reflection.BindingFlags.SetProperty, Nothing, field, New Object() {GetHiddenItems() }, Nothing, Nothing, Nothing)

乾杯