簡體   English   中英

字典的通用/ DRY方式<string, T>

[英]Generic/DRY way to return Dictionary<string, T>

我有一個CSV解析器,它逐行接受文本並將其解析為值。 我試圖將這些值放在Dictionary<string, T>並返回它,其中T是CharacterStatElement類的后代。 確實知道我在解析CSV時希望T是哪個類,但是我不想多次重寫/復制同一解析器函數來覆蓋我想從中返回的每個Type。

我應該為整個事情編寫一個通用方法(如果是的話,我該如何在方法中聲明並返回?),或者我應該在這里做其他方式?

有關CharacterStatElement的更多信息:每個子類都包含幾個字段,這些字段是我在使用反射進行解析時得出的。 每個子類都有不同的值,但是應該以相同的方式解析所有子類。 此外,每次單擊僅發生一次,而不是循環執行,因此速度不是問題。 提取方法的肉以將其包裝在非泛型方法中對我沒有多大幫助,因為大多數解析方法都與我使用反射的類型有關。

您可以使用通用方法。 為了在類型參數上使用反射,您可以使用typeof(T)獲得一個Type對象。 這樣,您可以實例化該類型並動態設置屬性。 對於泛型而言,這是一個相當糟糕的情況。 如果您只是使用object而不是T那么幾乎所有的工作都將以相同的方式進行。 這表明不需要泛型。

您還可以將“策略”傳遞給通用函數,該通用函數知道如何將原始解析的字段(可能是string[] )轉換為T 該策略將是Func<string[], T> 這樣,根本就沒有反射,這是泛型的干凈用例。

或者,使CSV解析器返回IEnumerable<string[]>並在CSV解析方法之外處理到T的轉換。

我建議CharacterStatElement類具有一種知道如何解析輸入行其余部分的方法。 每個派生類都將被重寫以執行其特定的解析過程。 將任何輔助方法添加到基類,以便最小化派生類中所需的編碼。

然后,您可以按照以下方式處理CSV文件的每一行。 解析開始,為您提供確定正確的類以解析整個行所需的信息。 然后創建正確的派生類的實例,並將其傳遞到行中進行處理。 然后將值添加到全局字典中。 簡單。

暫無
暫無

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

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