代码之家  ›  专栏  ›  技术社区  ›  Anemoia

newlatebinding.lateset到反射调用

  •  4
  • Anemoia  · 技术社区  · 16 年前

    假设我有一个excel.pivotfield,我需要设置 HiddenItemsList 我的目标。

    VB.NET和 Option Strict Off 和; Option Explicit Off 这将导致:

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

    虽然这与此安全设置一起工作,但在设置时显然不工作 Option Strict On Option Explicit On .

    IDE无法解决我的PivotField上的HiddenItemsList属性(第一个问题)。

    但是当使用后期绑定时,它工作得很好。

    现在下一步是启用选项严格和显式(我们将在将来转换为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 所以我被困在那里了。

    还有帮助?;-)

    1 回复  |  直到 16 年前
        1
  •  1
  •   Anemoia    16 年前

    总是很高兴回答你自己的问题。

    GetType(Excel.PivotField).GetProperty("HiddenItemsList") 什么也不返回,我们需要另一种方式。

    有一种方法 Type ,即 InvokeMember ,并且使用正确的属性,该方法可以工作!

    这是其他人的答案:d

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

    干杯