ファイルから値を読み込んだ後、一般的なリストを返そうとしています。しかし、型操作をいじった後でも、私はそれを私に同意させることができません。コードは以下のとおりです。私の質問は次のとおりです。
- 以下で始めているように、すべてのキーの種類を識別する必要がありますか、それとももっと簡単な方法がありますか? ここでは「where T: ...」が関連している可能性がありますが、可能であればDateTime、int、string、doubleなどを許可したいのですが、「where」でそれらを行う方法がわかりません。
- 日時のリストに DateTime 項目を追加できないのはなぜですか?
- タイプ(listType)を取得しようとすると、これは範囲外のようです。上記の行で使用する型を宣言しても、そのようなオブジェクトは存在しないと表示されます。
あなたの考えに感謝します
public static List<T> FileToGenericList<T>(string FilePath, int ignoreFirstXLines = 0, bool stripQuotes = true)
{
List<T> output = new List<T>();
Type listType = output.GetType().GetGenericArguments()[0];
try
{
using (StreamReader stream = new StreamReader(File.Open(FilePath, FileMode.Open)))
{
string line;
int currentLine = 0;
while ((line = stream.ReadLine()) != null)
{
// Skip first x lines
if (currentLine < ignoreFirstXLines) continue;
// Remove quotes if needed
if (stripQuotes == true)
{
line = line.Replace(@"""", @"");
}
// Q1 - DO I HAVE TO HAVE THIS FOR EACH TYPE OR IS THERE A QUICKER WAY
if (listType == typeof(System.DateTime))
{
DateTime val = new System.DateTime();
val = DateTime.Parse(line);
// Q2 ERROR: 'Argument type is not assignable to parameter type 'T''
output.Add(val);
// For some reason the type 'listType' from above is now out of scope when I try a cast
output.Add((listType)val);
}
if (listType == typeof(System.String))
{
//DateTime val = new System.DateTime();
//val = DateTime.Parse(line);
//output.Add(val.ToString());
}
// Continue tracking for line skipping purposes
currentLine++;
}
}
}
catch (Exception ex)
{
throw new Exception("Error - there was a problem reading the file at " + FilePath + ". Error details: " + ex.Message);
}
return output;
}