.Net CodeDom — создать делегата с эквивалентом оператора AddressOf?

Изменить:

Есть ли способ создать экземпляр делегата в .Net с помощью CodeDom? Я хочу сгенерировать что-то похожее на следующее:

Dim myDelegate As someDelegateType = New someDelegateType(AddressOf implementingMethod)

Ниже приведена дополнительная информация о контексте...

Исходный вопрос:

Я использую CodeDom из .Net framework (v3.5, если это имеет значение) для создания класса. Один из классов определяет метод делегата, который в VB.Net выглядит так:

Public Delegate Function filterByIdDelegate(ByVal obj As Object, ByVal id As Integer) As Boolean

Затем у меня есть метод, который обеспечит реализацию:

Private Function filterById(ByVal obj As Object, ByVal id As Integer) As Boolean
    Return (obj.ID = id)
End Function

Вот проблема; как вы создаете экземпляр делегата (используя эквивалент AddressOf для VB.Net)? В настоящее время я делаю это (<filterByIdFunctionName> - это строка, содержащая имя функции делегата, `' - это имя поля делегата):

Dim getFunction = New System.CodeDom.CodeMemberMethod()
With getFunction
'Declare delegate instance
.Statements.Add( _
    New System.CodeDom.CodeVariableDeclarationStatement( _
        New System.CodeDom.CodeTypeReference(<filterByIdDelegateName>) _
        , "myDelegate" _
        , New System.CodeDom.CodeObjectCreateExpression( _
            <filterByIdDelegateName> _
            , New System.CodeDom.CodeExpression() { _
                New System.CodeDom.CodeMethodReferenceExpression( _
                    New System.CodeDom.CodeThisReferenceExpression() _
                    , <filterByIdFunctionName> _
                  ) _
              } _
          ) _
      ) _
  )
End With

Это дает следующий результат:

Dim myDelegate As filterByIdDelegate = New filterByIdDelegate(Me.filterById)

То, что я хочу получить, это:

Dim myDelegate As filterByIdDelegate = New filterByIdDelegate(AddressOf Me.filterById)

Есть предположения?


person AJ.    schedule 25.04.2011    source источник


Ответы (1)


Хорошо... после (намного...) дальнейших поисков в Интернете я нашел малоизвестный пост на dotNetMonster (спасибо Заку, также известному как bluedude, который опубликовал полезный код), который было связанное решение для С#. Для удобства людей из StackOverflow, вот мой повторный взлом VB.Net его кода (настроенный для моего сценария):

    Dim createDelegate = New CodeDom.CodeDelegateCreateExpression( _
            New CodeDom.CodeTypeReference(filterByIdDelegate.Name) _
            , New System.CodeDom.CodeThisReferenceExpression() _
            , "filterById" _
        )

    Dim varInit = New CodeDom.CodeObjectCreateExpression( _
            New CodeDom.CodeTypeReference(filterByIdDelegate.Name) _
            , createDelegate _
        )

    Dim varDecl = New CodeDom.CodeVariableDeclarationStatement( _
            filterByIdDelegate.Name _
            , "myDelegate" _
            , varInit _
        )

Результат:

Dim myDelegate As filterByIdDelegate = _
    New filterByIdDelegate(AddressOf Me.filterById)

Чтобы создать ссылку на метод, вы должны фактически передать само выражение создания делегата в качестве параметра. В приведенном выше примере будет объявлена ​​новая переменная с именем myDelegate типа filterByIdDelegate.Name, а затем назначен новый экземпляр делегата, ссылающийся на метод реализации Me.filterById() (c# this.filterById()).

person AJ.    schedule 26.04.2011