修改
有没有办法使用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)
有什么想法吗?
答案 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>