使用返回值调用public void和private string方法

时间:2015-08-13 21:43:08

标签: c# winforms

在我的应用程序中,我想让我的主窗体(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”没有过载,并且我需要一个对象引用。究竟是什么引发了错误?

2 个答案:

答案 0 :(得分:5)

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。

答案 1 :(得分:2)

您的方法sendover不尊重sendtoemail代理人的方法签名:

public delegate void sendtoemail(object sender, EventArgs e); // accepts 2 parameters

而不是方法声明:

public void sendover() { // ...

...宣布为......

public void sendover(object sender, EventArgs e) { // ...