簡體   English   中英

如何轉換ObservableCollection <SomeType> 回到ObservableCollection <T> ?

[英]How to convert ObservableCollection<SomeType> back to ObservableCollection<T>?

我在返回類型的通用方法中努力轉換回通用集合類型。

此答案中明確寫明避免

在泛型中打開類型

但是在這個答案中解釋了如何做。

我承認,我使用泛型來避免為三種不同的返回類型編寫相同代碼的三倍。 現在,編譯器告訴我,

並非所有代碼路徑都返回值

調用者方法的示例調用者:

public ObservableCollection<LoadedJockey> Jockeys { get; private set; }

Jockeys = await _updateDataService.UpdateDataAsync(Jockeys, DataUpdateModules.JPlFrom, DataUpdateModules.JPlTo, "updateJockeysPl");

我的通用方法如下所示:

public async Task<ObservableCollection<T>> UpdateDataAsync<T>(ObservableCollection<T> genericCollection, int idFrom, int idTo, string jobType) where T : IConvertible
        {
            //variables reset here
            _loopCounterProgressBar = 0;
            _idFromProgressBar = idFrom;
            _idToProgressBar = idTo;

            if (typeof(T) == typeof(LoadedHorse))
            {
                //do something here
            }
            else if (typeof(T) == typeof(LoadedJockey))
            {
                //do something here
            }
            else if (typeof(T) == typeof(LoadedHistoricalRace))
            {
                //do something here
            }

            //initial
            SemaphoreSlim throttler = new SemaphoreSlim(_degreeOfParallelism);
            List<Task> tasks = new List<Task>();
            TokenSource = new CancellationTokenSource();
            CancellationToken = TokenSource.Token;
            OnProgressBarTick();

            //run loop
            for (int i = idFrom; i < idTo; i++)
            {
                int id = i;

                tasks.Add(Task.Run(async () =>
                {
                    try
                    {
                        if (CancellationToken.IsCancellationRequested)
                            return;

                        await throttler.WaitAsync(TokenSource.Token);

                        if (jobType.Contains("Horses"))
                        {
                            await //call service method
                        }
                        else if (jobType.Contains("Jockeys"))
                        {
                            await //call service method
                        }
                        else if (jobType.Contains("Historic"))
                        {
                            await //call service method
                        }
                    }
                    catch (Exception e)
                    {

                    }
                    finally
                    {
                        _loopCounterProgressBar++;

                        EventHandler<UpdateBarEventArgs> progressBarTick = _updateProgressEventHandler;

                        OnProgressBarTick();

                        throttler.Release();
                    }
                }));
            }

            try
            {
                await Task.WhenAll(tasks);
            }
            catch (OperationCanceledException)
            {

            }
            finally
            {
                //save results in file when finish

                }
            }
            //here I wanted to return some result depending on T
            if (typeof(T) == typeof(LoadedHorse))
            {
                return (ObservableCollection<T>)Convert.ChangeType(Horses, typeof(ObservableCollection<T>));
            }
            else if (typeof(T) == typeof(LoadedJockey))
            {
                return (ObservableCollection<T>)Convert.ChangeType(Jockeys, typeof(ObservableCollection<T>));
            }
            else if (typeof(T) == typeof(LoadedHistoricalRace))
            {
                return (ObservableCollection<T>)Convert.ChangeType(Races, typeof(ObservableCollection<T>));
            }
        }

如您所見,我希望收到3種不同類型的T。 而且我認為我涵蓋了所有內容。 我的解決方案基於此示例 我猜想我可能Convert我的類型錯誤地ConvertT ,但是我不應該怎么做。

正如Camilo Terevinto所建議的那樣,我在if else鏈的結尾處添加else { throw new ArgumentException() }並且編譯器感到滿意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM