2015-02-09 60 views
0

我有一個CSV分析器,它逐行接收文本並將其解析爲值。我試圖把這些值放在Dictionary<string, T>並返回它,其中T是CharacterStatElement的後裔。我想知道當我解析CSV時我想要T是什麼類,但是我不想重複/複製同一個解析器函數幾次,以涵蓋我想要從中返回的每個類型。通用/幹方式返回詞典<string, T>

我應該爲整個事情寫一個泛型方法(如果是的話,我該如何在方法中聲明並返回?)或者我應該在這裏做一些其他模式?

有關CharacterStatElement的更多信息:每個子類都包含幾個使用反射進行解析的字段。每個子類都有不同的值,但它們都應該以相同的方式解析。此外,這隻發生一次按鈕點擊,而不是一個循環,所以速度不是問題。並且提取方法的肉以包裝在非泛型方法中並不是很好,因爲大多數解析方法都與我使用反射的目標類型相關聯。

+0

你知道你可以用來解析'.CSV'文件的許多強大的函數..例如'string.Split()'函數允許這種性質的事情,你可以創建一個類適合或模仿文件結構... – MethodMan 2015-02-09 23:04:32

+0

如果它始終受到CharacterStatElement的蹂躪,那麼爲什麼不返回/傳遞字符串的字典=> CharacterStatElement – pm100 2015-02-09 23:15:22

+0

我實際上使用string.Split,它是知道什麼類型投入字段,我在課堂上通過了反思。 – Arcandio 2015-02-09 23:57:16

回答

1

您可以使用通用方法。爲了在類型參數上使用反射,您可以使用typeof(T)得到一個Type對象。這樣你可以實例化該類型並動態地設置屬性。對於泛型而言,這是一個相當不好的情況。如果你只是使用object而不是T,所有東西都會以相同的方式工作。這是一個不需要泛型的標誌。

您還可以將「策略」傳遞到通用函數中,該函數知道如何將原始解析字段(可能是string[])轉換爲T。該策略將是Func<string[], T>。這樣就沒有任何反思,這是一個泛型的清潔用例。

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

+0

是的,最終,我最終使用字典<字符串,對象>,一旦我找出了我的鑄造問題。 – Arcandio 2015-02-10 16:06:27

1

我會建議CharacterStatElement類有一個知道如何解析輸入行剩餘部分的方法。每個派生類都被覆蓋以執行其特定的解析過程。將任何幫助器方法添加到基類,以儘量減少派生類中所需的編碼。

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

+0

然後我想我會只寫幾個實用函數來將分割字符串解析爲實際值,並根據我需要從中得到的類型在它們之間切換,嗯?這可能值得一試,但我想我必須分別解析每個領域...... – Arcandio 2015-02-10 02:50:25

相關問題