NewLateBinding.LateSet для вызова отражения - PullRequest
4 голосов
/ 08 февраля 2010

Предположим, у меня есть 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 не может разрешить свойство HiddenItemsList в моем PivotField (первая проблема).

Но при использовании позднего связывания это работает отлично.

Теперь следующим шагом является включение Option Strict и Explicit (мы собираемся конвертировать в C # в будущем).

Итак, я смотрю, как код скомпилирован:

NewLateBinding.LateSet(field , Nothing, "HiddenItemsList", New Object() { GetHiddenItems() }, Nothing, Nothing)
Легко ли?

Но этот код опирается на пространство имен Microsoft.VisualBasic. И, конечно же, мы этого не хотим.

Итак, я попытался преобразовать его в простой вызов Reflection:

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

К сожалению, первая часть (GetType(Excel.PivotField).GetProperty("HiddenItemsList")) уже возвращает Nothing, поэтому я застрял там.

А помочь? ; -)

1 Ответ

1 голос
/ 08 февраля 2010

Всегда приятно ответить на свой вопрос.

Поскольку GetType(Excel.PivotField).GetProperty("HiddenItemsList") ничего не возвращает, нам нужен другой способ.

Есть метод на Type, а именно InvokeMember, и с правильными свойствами метод работает!

Вот ответ для других SO: E

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

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...