Передача адреса sub в свойство класса - PullRequest
0 голосов
/ 07 апреля 2020

В VB. net Я мог бы использовать AdressOf при передаче подпрограммы в качестве параметра.

Я новичок в C#, и я пытаюсь использовать делегат для передачи подпрограммы в класс свойство, поэтому я могу вызвать sub из этого класса.

Вот мой код на данный момент ...

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() хочет, чтобы я передал userlogin.

Что я делаю не так?

ОБНОВЛЕНИЕ:

Этот код в 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

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

чтобы установить делегата, вам не нужны скобки. Они нужны вам только тогда, когда выполняет делегата.

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);
0 голосов
/ 07 апреля 2020

Вы объявляете InitializeUser (строка userLogin), но затем вызываете его без аргументов. Вам нужно добавить аргумент при вызове или структуру и объявить ваш метод, чтобы он не нуждался в аргументах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...