【发布时间】:2011-05-09 21:58:20
【问题描述】:
根据 do 工作方法,我的结果可能是字符串列表或字节 [] 列表
我们如何查看RunWorkerCompletedEventArgs e -
if (e is List<String>)
这是正确的检查方法吗?
【问题讨论】:
标签: c# backgroundworker
根据 do 工作方法,我的结果可能是字符串列表或字节 [] 列表
我们如何查看RunWorkerCompletedEventArgs e -
if (e is List<String>)
这是正确的检查方法吗?
【问题讨论】:
标签: c# backgroundworker
不,这不是正确的方法。
正确的方法是这样使用:
if(e.Result is List<string>)
{
//...
}
else if(e.Result is List<byte[]>)
{
//...
}
else
{
//...
}
e 将始终是 RunWorkerCompletedEventArgs 类型。但是这个类包含一个属性Result,它包含您的DoWork 事件处理程序的结果。就是这个,你需要检查一下。
【讨论】:
是的,这是一种可能的方法。
如果你只有两种类型,那就很容易了:
if(e.Result is List<string>)
{
}
else if(e.Result is List<byte[]>)
{
}
else
{
}
但是,如果您必须支持的不仅仅是两个或三个,那么问题就来了。在这种情况下,我将创建一个Dictionary<Type, Action<object>> 并为每种类型编写单独的函数。像这样的:
var supportedTypes = new Dictionary<Type, Action<object>>();
supportedTypes.Add(typeof(List<string>), ComputeListOfStrings);
supportedTypes.Add(typeof(List<byte[]>), ComputeListOfByteArrays);
private void ComputeListOfString(object listOfStrings)
{
var list = (List<string>)listOfStrings;
}
private void ComputeListOfByteArrays(object listOfByteArrays)
{
var list = (List<byte[]>)listOfByteArrays;
}
这使得支持新类型变得更加简单,并且在 if-else-if 遇到顺序问题时也保持为 O(1)。
在您的后台工作人员中使用如下:
worker.OnRunWorkerCompleted += (sender, e) =>
{
Action<object> supportedAction;
supportedTypes.TryGetValue(e.Result.GetType(), out supportedAction);
if(supportedAction != null)
{
supportedAction();
}
};
【讨论】:
RunWorkerCompletedEventArgs.Result。
e.Result 是您的结果的属性,因此要获取您可以执行的类型:
if(e.Result.GetType().Equals(typeof(List<String>)))
【讨论】: