.Net CodeDom - Создать делегата с эквивалентным оператором AddressOf? - PullRequest
0 голосов
/ 25 апреля 2011

Изменить:

Есть ли способ создать экземпляр делегата в .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)

Есть мысли?

1 Ответ

0 голосов
/ 26 апреля 2011

Ладно ... после ( много ...) больше копаний в интернете я нашел неясный пост на dotNetMonster (спасибо Зак ака bluedude , который разместил полезный код), у которого было соответствующее решение для C #.Для пользы ребят из 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()).

...