繁体   English   中英

创建并传递自定义函数作为委托(VB.NET 2005)

[英]Create and pass custom function as a delegate (VB.NET 2005)

我有一个函数Process(data, f) ,其中data是常规参数, f是处理数据所需的函数(作为对Process的委托传递)

f的签名是int f(a,b,c) ,Process在调用委托时提供abc

直到这里,都是标准的委托用法。

现在,我有一个特殊但很常见的情况,我想用常量f函数调用Process。 因此,我想编写SimpleProcess(data, k)以便在这种情况下调用方无需创建委托,只需传递常数k(唯一需要的信息)即可。

因此,我需要动态创建一个常量函数g(a,b,c) ,该函数需要3个参数(将被忽略)并始终返回k 这必须在SimpleProcess函数中完成,这样我就可以从该函数中简单地调用Process(data, g) ,而无需为此特殊情况重写整个Process函数。

这有可能吗,我如何实现呢?

谢谢。

编辑:好的,我没有在标题中发现“ 2005”位。 我最初的答案是稍后(在线下)-这是VB.NET 2005的完整答案。

您可以创建一个保存常量值的类(或结构,我想),然后使用AddressOf将该类型的函数转换为委托。 您可以通过创建Shared函数将这两个步骤放在一起来简化此过程。

这是一个简短但完整的程序来演示这一点:

Public Delegate Function Function3 (ByVal x As Integer, _
    ByVal y As Integer, ByVal z As Integer) As Integer

Public Class Constant

    Private value As Integer

    Public Sub New (ByVal value As Integer)
      Me.value = value    
    End Sub

    Public Function ReturnValue(ByVal x As Integer, _
        ByVal y As Integer, ByVal z As Integer) _
        As Integer
      Return value
    End Function

    Public Shared Function CreateFunction _
        (ByVal x As Integer) As Function3    
      Dim c As Constant = New Constant(x)
      return AddressOf c.ReturnValue
    End Function

End Class

Public Module Test
    Public Sub Main
      Dim func As Function3 = Constant.CreateFunction(3)
      Console.WriteLine(func(8, 9, 10))
    End Sub
End Module

在您的情况下,您可以将其用于:

Process(data, Constant.CreateFunction(g))

原始答案

您可以使用lambda表达式,尽管它具有三个参数,但并不是很好:

Process(data, Function(x as Integer, y as Integer, z as Integer) g)

另一种选择是编写返回函数的函数,该函数返回常量:

Public Function Constant(value as Integer) As MyDelegateType
    Return Function(x as Integer, y as Integer, z as Integer) value
End Function

然后调用:

Process(data, Constant(g))

抱歉,如果某些语法稍有偏离-我不是VB人士。

您是否考虑过将功能分为两个具有不同签名的功能。 我假设您的委托函数将返回常量提供的值。

因此,您的方法的委托版本将仅执行计算“恒定”值所需的处理。

    Function Process(ByVal data As Object, ByVal f As MyDelegate) As Object
    Dim k As Integer
    ' Calculate k

    Return Process(data, k)
End Function

Function Process(ByVal data As Object, ByVal k As Integer) As Object
    Dim stuff As Object

    ' do stuff with k
    Return stuff
End Function

Delegate Function MyDelegate(ByVal a As Object, ByVal b As Object, ByVal c As Object) As Integer

鉴于较新的语言支持lambda表达式,一种似乎过时的方法是创建一些委托工厂的通用类。 对于三个可变参数的函数,我还没有做过,但是这种方法很容易适应这种情况。 这种方法有点像@Jon Skeet:的上述答案,但是要使用我的通用工厂之一(如果我将其扩展为三个变量加一个固定参数),您将要做的就是定义一个带有四个参数的函数并简单地返回最后一个,然后使用以下命令创建所需的委托(例如,值为19)

Process(data, FunctionOf(of Integer, Integer, Integer, Integer).NewInv(of Integer)(AddressOf FunctionToReturnLastValue, 19))

请注意,与Lambda表达式不同,可以在不使编辑并继续无效的情况下添加,更改或删除上述代码(请注意,可以推断出(整数)的最后一个)。 也与lambda不同,固定参数值是在创建委托时评估的,而不是在调用它们时评估的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM