c# - 将子的地址传递给类属性
问题描述
在 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
解决方案
为了设置委托,您不需要括号。只有在执行委托时才需要它们。
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);
推荐阅读
- c# - 有没有办法声明一个 C# lambda 并立即调用它?
- kubernetes - 后端服务的问题子路径入口控制器
- java - 初始化错误:测试类应该只有一个公共零参数
- jquery - 当会话在 MVC5 中过期时,如何防止引导模式弹出窗口在其中打开登录屏幕
- quickblox - 有没有办法让消息在quickblox群聊中读取状态只有在群组中的每个人都阅读了它之后
- java - 如何以编程方式从 Spring 应用程序中获取 .key 文件的路径?
- html - iPhone上的Force/3dTouch手势为元素提供了奇怪的背景
- swift - 如何在 Swift 中转义 macOS 文件系统 URL?
- python - Python上元组派生类的自定义酸洗
- android - 安卓。Reddit API,无法回复评论(403 Forbidden)