在C#中向事件处理程序添加一些参数

3

现在我有这段代码:

public void getRankingList(string country,string type)
    {            
        WebClient client = new WebClient();
        client.AllowReadStreamBuffering = true;
        string url = "......";
        client.DownloadStringCompleted += getRankingResult;
        client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
    }
private void getRankingResult(object sender, DownloadStringCompletedEventArgs e)
    {
        .........
    }

所以现在我能否向downloadCompleted事件中添加一些段落呢?比如说:
private void getRankingResult(object sender, DownloadStringCompletedEventArgs e, string Para)
    {
        .........
    }

3
使用 Lambda 表达式。 - Hans Passant
2个回答

4
public void getRankingList(string country,string type)
    {            
        WebClient client = new WebClient();
        client.AllowReadStreamBuffering = true;
        string url = "......";
        client.DownloadStringCompleted += (sender, args) => 
        getRankingResult(sender, args, "para");
        client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
    }

private void getRankingResult(object sender, DownloadStringCompletedEventArgs e, string Para)
{
    // .....
}

2
没问题,我自己也直到昨天才知道这种方法。它改变了我对Lambda表达式的看法(它们的使用似乎比简单的“Where” LINQ更广泛)。 - user1017882
工作得很完美:D 我有时在使用SQL时看到过"=>", 但并不真正理解,现在我知道它的名字叫做"lambda表达式"了:D 非常感谢! - user3448806

1
如果DownloadStringCompletedEventArgs不是封闭类,则可以创建一个新类并继承它,并添加您的附加string Para字段。

你将如何说服WebClient在触发事件时使用你新继承的类呢? - Maarten
@Maarten - 你不只是在事件处理程序中转换它吗? - user1017882
@DeeMac 不行。你会得到一个 InvalidCastException 或者其他错误,因为事件参数对象不是继承类型,而是 DownloadStringCompletedEventArgs 类型。事件处理程序的事件参数只是一个包含一些数据的简单对象,所以你仍然不能将一个对象强制转换为它不是的另一种类型。 - Maarten
1
如果你有 class A { }class B: A { },那么以下代码会导致一个转换异常 var a = new A(); var b = (B)a;,因为 A 不是 B 类型,这就是我们所讨论的。WebClient 创建了一个类型为 DownloadStringCompletedEventArgs 的对象,在你的事件处理程序中,你要将它强制转换为一个继承类型 InheritedDownloadStringCompletedEventArgs,这是行不通的。 - Maarten
@ChrisWalsh 而且,如果实际对象不是继承类型,则在任何其他地方都不起作用(将其转换为继承类型)。 - Maarten
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接