none
System.Delegate.CreateDelegate方法报错:类型必须从委托派生

    问题

  • 我在用VB.NET编程序,使用.NET Framework 4.0。我对于委托(Delegate)不熟悉,但现在需要用到。

    我尝试写了这样的代码:

    Public Class frmMain

        ...

        Public Sub TestSub()

        ...

        End Sub

        Public Sub TestDelegate()

            Dim theDelegate As System.Delegate

            theDelegate = System.Delegate.CreateDelegate(Me.GetType(), Me, "TestSub")

            txtTest.Invoke(theDelegate)

        End Sub

    End Class

    结果,执行TestDelegate方法的第二行(theDelegate = System.Delegate.CreateDelegate(Me.GetType(), Me, "TestSub"))时,报错:类型必须从委托派生。

    这个该怎么解决呢?

    谢谢!

    2017年3月28日 3:51

全部回复

  • 一般不这样用,我用C#的语法解释一下,下面是定义一个方法的引用,

    int Sum(int a,int b) { return a+b; } 这是个求和的方法

    我定义一个委托

    delegate  int Sum(int a,int b);

    注意到技巧,就是方法的签名,前面加delegate

    参考

    http://www.cnblogs.com/BLoodMaster/archive/2010/07/06/1771926.html

    编译器在编译时,会把它编译为System.Delegate类型,不需要我们理会。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年3月28日 4:29
  • Hi,

    感谢你在MDSN论坛发帖。

    对于你这样的用法,我没这么用过,不太确定用法对不对。

    正常的使用方法是:

    1.创建一个名为 MySubDelegate 的委托。

    Delegate Sub MySubDelegate(ByVal x As Integer)  

    2. 声明一个类,该类包含与该委托具有相同签名的方法。
    Class class1  
        Sub Sub1(ByVal x As Integer)  
            MsgBox("The value of x is: " & CStr(x))  
        End Sub  
    End Class  

    3.定义一个方法,该方法创建该委托的实例并通过调用内置的 Invoke 方法调用与该委托关联的方法
    Protected Sub DelegateTest()  
        Dim c1 As New class1  
        ' Create an instance of the delegate.  
        Dim msd As MySubDelegate = AddressOf c1.Sub1  
        ' Call the method.  
        msd.Invoke(10)  
    End Sub  

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月28日 5:34
    版主
  • 第一个参数应该是委托的类型, 比如

    GetType(Action)



    http://feiyun0112.cnblogs.com/

    2017年3月28日 8:06
    版主