[英]Call public void and private string methods with return value
在我的應用程序中,我想讓我的主窗體(Form1)在UserControl(EmailControl)上調用一個方法。 以下是我要調用的三種主要方法:
public void InitializeConnection(string hostname, int port)
{
try
{
_imapClient = new TcpClient(hostname, port);
_imapNs = _imapClient.GetStream();
_imapSw = new StreamWriter(_imapNs);
_imapSr = new StreamReader(_imapNs);
label1.Text = "*** Connected ***";
Response();
}
catch (SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
,
public void AuthenticateUser(string username, string password)
{
_imapSw.WriteLine("$ LOGIN " + username + " " + password);
_imapSw.Flush();
label2.Text = "Logged in";
Response();
}
和
public string MailCount()
{
_imapSw.WriteLine("$ STATUS INBOX (messages)");
_imapSw.Flush();
string res = Response();
Match m = Regex.Match(res, "[0-9]*[0-9]");
return m.ToString();
}
為此,我在usercontrol頁面上使用了它:
Form1.getemail += new Form1.sendtoemail(this.sendover);
和
public void sendover()
{
InitializeConnection("hostname", 123);
AuthenticateUser("username", "password");
MailCount();
}
然后在我的主頁上
public delegate void sendtoemail(object sender, EventArgs e);
public event sendtoemail getemail;
和
private void Form1_Load(object sender, EventArgs e)
{
if (this.getemail != null)
{
this.getemail(this, e);
}
}
完成此操作后,在我的usercontrol頁面上,它告訴我“ sendover”匹配委托“ sendtoemail”沒有重載,並且我需要一個對象引用。 到底是什么引發錯誤?
getemail
事件的類型為sendtoemail
,因此您添加為處理程序的函數必須與該簽名匹配。
這是兩個解決方案:
更改
public void sendover()
至
public void sendover(object sender, EventArgs e)
或改變
Form1.getemail += new Form1.sendtoemail(this.sendover);
至
Form1.getemail += (s, e) => sendover();
第一種解決方案更改sendover的簽名以匹配委托類型,第二種解決方案創建具有正確類型的匿名函數,該函數調用sendover。
您的方法sendover
不尊重sendtoemail
委托的方法簽名:
public delegate void sendtoemail(object sender, EventArgs e); // accepts 2 parameters
代替方法聲明:
public void sendover() { // ...
...聲明為...
public void sendover(object sender, EventArgs e) { // ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.