首页 > 解决方案 > 将子的地址传递给类属性

问题描述

在 VB.net 中,我可以在将 sub 作为参数传递时使用 AdressOf。

我是 C# 新手,我正在尝试使用委托将子传递给类属性,因此我可以从此类调用子。

到目前为止,这是我的代码...

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            AuthorizationHelper.UserHelperOptions options = new AuthorizationHelper.UserHelperOptions()
            {
                UserAuthorizedCallback = UserHelper.InitializeUser() // < problem
            };
        }
    }
}

public class UserHelper
{
    public static void InitializeUser(string userLogin)
    {
        // Do some stuff
    }
}


// -------------------------------------------------------------------------------------------------
// In another class library...
// -------------------------------------------------------------------------------------------------

public class AuthorizationHelper
{
    public class UserHelperOptions
    {
        public delegate void UserAuthorizedCallbackDelegate(string userLogin);
        public UserAuthorizedCallbackDelegate UserAuthorizedCallback { get; set; }
    }

    public static void VerifyUser(UserHelperOptions options, string login, string password)
    {
        // If is valid user...
        options.UserAuthorizedCallback.Invoke(login);
    }
}

但是UserAuthorizedCallback = UserHelper.InitializeUser()希望我通过用户登录。

我究竟做错了什么?

更新:

VB 中的这段代码完美运行,这就是我要转换为 c# 的内容...

Module Module1

    Sub Main()
        Dim options As New AuthorizationHelper.Options With {
            .Callback = AddressOf UserHelper.InitializeUser
        }
        AuthorizationHelper.VerifyUser(options, "test", "test")
    End Sub

End Module


Public Class UserHelper

    Public Shared Sub InitializeUser(userLogin As String)
        Console.WriteLine("bla bla")
        Console.ReadLine()
    End Sub

End Class


Public Class AuthorizationHelper

    Public Class Options
        Public Delegate Sub UserAuthorizedCallbackDelegate(userLogin As String)
        Public Property Callback As UserAuthorizedCallbackDelegate
    End Class


    Public Shared Sub VerifyUser(options As Options, login As String, password As String)
        ' If is valid user...
        options.Callback.Invoke(login)
    End Sub

End Class

标签: c#

解决方案


为了设置委托,您不需要括号。只有在执行委托时才需要它们。

AuthorizationHelper.UserHelperOptions options = new AuthorizationHelper.UserHelperOptions()
{
    UserAuthorizedCallback = UserHelper.InitializeUser
};

当您将它与您的 VB.NET 代码进行比较时,您会发现它非常相似:

Dim options As New AuthorizationHelper.Options With {
    .Callback = AddressOf UserHelper.InitializeUser // no paranthesis here
}

但是,当您要执行委托时,您需要在括号中添加参数:

UserAuthorizedCallback(userLogin);

推荐阅读