如有任何指导,我们将不胜感激:我正在将我完成的vb.net项目转换为C#。我不知道如何处理C#中的事件处理。我在UserAccount类中设置了一个安全警报事件:
Public Class UserAccount
Private m_UserAccountID As Guid
Private m_Username As String
Private m_Password As String
Private m_Email As String
Public Event SecurityAlert(ByVal username As String, ByVal password As String)
然后我提出了一种身份验证方法:
Public Function Authenticate(ByVal U As String, ByVal P As String) As Boolean
RaiseEvent SecurityAlert(U, P)
If m_Username = U And m_Password = P Then
Return True
End If
Return False
End Function
然后我在我的登录表单中处理:
Private Sub objUserAccount_SecurityAlert(ByVal username As String, ByVal password As String) Handles objUserAccount.SecurityAlert
If username = "sam" And password = "333" Then
MessageBox.Show("This is a security breach! This employee has been fired!")
End
End If
End Sub
我在C#项目中有相同的类和形式,但我不知道在哪里以及如何设置延迟门,以及处理这些参数,而不是对象和EventArgs。正如我所说,任何指导都将不胜感激。这是一个夏天的课堂项目,我正在自己转换,因为我想提高我的知识。
好吧,就像我说的,到目前为止已经做到了:
namespace BusinessObjects
{
public delegate void SecurityAlert(string username, string password);
public class UserAccount
{
private Guid m_UserAccountID;
private String m_Username;
private String m_Password;
private String m_Email;
public event SecurityAlert Alert;
然后在我的类身份验证方法中,我试图提出它:
Alert += new SecurityAlert(U,P);
我从Jeffery的帖子中看到这是不正确的,并将其更改为:
Alert += new SecurityAlert(Alert);
这是有道理的,因为看起来我现在引用的是处理我在登录表单中设置的事件的Alert方法:
private void Alert(String username, String password){
if(username == "sam" && password == "333"){
MessageBox.Show("This is a security breach! This employee has been fired!");
}
}
但是我的UserAccount和LoginForm是两个不同的类,它们如何相互引用呢?我得到一个错误:
Alert += new SecurityAlert(Alert); Delegate to an instance method cannot have null 'this'.
Visual Basic和C#处理事件的方式有一些不同。首先,Visual Basic允许您在声明事件的同一行指定事件处理程序的签名;C#使您将其拆分为两行(定义委托类型,然后声明事件)。其次,C#没有与Visual Basic的Handles
子句等效的子句。相反,您必须手动注册和取消注册事件,这与使用Visual Basic的AddHandler
和RemoveHandler
非常类似。
下面是一个类的例子,它定义了一个事件,并在方法中引发它:
class UserAccount
{
public delegate void SecurityAlertHandler(String username, String password);
public event SecurityAlertHandler SecurityAlert;
public void RaiseSecurityAlert(String u, String p)
{
SecurityAlert(u, p);
}
}
下面是一个注册事件处理程序并处理事件的类的示例:
class AlertHandler
{
public void RegisterHandler(UserAccount toMonitor)
{
toMonitor.SecurityAlert += HandleSecurityAlert;
}
private void HandleSecurityAlert(String username, String password)
{
Console.WriteLine("Got event: " + username + " => " + password);
}
}
这里有一些代码,你可以在调试器中逐步查看它的工作:
static void Main(string[] args)
{
UserAccount ua = new UserAccount();
AlertHandler ah = new AlertHandler();
ah.RegisterHandler(ua);
ua.RaiseSecurityAlert("User", "pwd");
}
由于Visual Basic的Handles
子句会自动注册事件处理程序,您可能想知道将事件注册(在我们的示例中为toMonitor.SecurityAlert += HandleSecurityAlert
)放在哪里。在您的情况下,这可能在您的登录表单的OnLoad方法中。您还需要使用-=
取消注册该事件。您可以将其放在Visual Basic代码中将objUserAccount
设置为Nothing的相同位置。
您可以在这里找到一些非常有用的信息
您的委托看起来是这样的:
public delegate void SecurityAlert(string username, string password);
这就是你将它包含在课堂中使用的方式:
public class UserAccount
{
public event SecurityAlert OnSecurityAlert;
}
以下是有关举办自定义活动的信息。
以下是关于c#中事件的一些附加信息
注册事件:
UserAccount userAccount = new UserAccount();
userAccount.OnSecurityAlert += new SecurityAlert(OnSecurityAlert);
事件处理程序方法:
private void OnSecurityAlert(string username, string password)
{
}