.Net CodeDom - 使用AddressOf运算符等效创建委托?

时间:2011-04-25 19:42:02

标签: .net vb.net codedom

修改

有没有办法使用CodeDom在.Net中创建委托实例?我想生成类似于以下内容的内容:

Dim myDelegate As someDelegateType = New someDelegateType(AddressOf implementingMethod)

以下是有关上下文的更多信息......

原始问题:

我正在使用.Net框架中的CodeDom(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

这是问题;如何创建委托实例(使用相当于VB.Net的AddressOf)?我目前正在这样做(<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 :(得分:0)

好的......之后(很多 ...)在互联网上挖掘更多我在dotNetMonster找到了一篇不起眼的帖子(感谢 Zach 又名< strong> 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)

为了创建对方法的引用,您必须实际将create delegate表达式本身作为参数传递。上面的示例将声明一个名为myDelegate类型为filterByIdDelegate.Name的新变量,然后为其指定一个新的委托实例,引用Me.filterById()的实现方法(c#this.filterById())。< / p>