Да, это один из возможных способов сделать это.
Если у вас есть только два типа, это будет довольно просто:
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;
}
Это упрощает поддержку новых типов и также остается O (1), в то время как if-else-if
сталкивается с проблемой порядка.
Используется ли это в фоновом режиме следующим образом:
worker.OnRunWorkerCompleted += (sender, e) =>
{
Action<object> supportedAction;
supportedTypes.TryGetValue(e.Result.GetType(), out supportedAction);
if(supportedAction != null)
{
supportedAction();
}
};