2010-02-08 265 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)

干杯