2015-10-05 2 views
3

Следующий код дает мне InvalidCastException, в котором говорится, что я не могу отличить от источника к типу foreach. Я попытался передать несколько разных общих коллекций с помощью метода, и я всегда получаю эту ошибку. Я не могу понять, почему. Любая помощь будет оценена по достоинству.InvalidCastException при генерации типичного типа

public static void WriteDataListToFile<T>(T dataList, string folderPath, string fileName) where T : IEnumerable, ICollection 
{  
    //Check to see if file already exists 
    if(!File.Exists(folderPath + fileName)) 
    { 
     //if not, create it 
     File.Create(folderPath + fileName); 
    } 

    using(StreamWriter sw = new StreamWriter(folderPath + fileName)) 
    { 
     foreach(T type in dataList) 
     { 
      sw.WriteLine(type.ToString()); 
     } 
    } 
} 
+0

Я очень подавлен вы не получаете некоторые другие исключения. 'File.Create (folderPath + имя_файла);' неправильно, вы открываете 'FileStream' и не закрываете его. 'StreamWriter' создаст файл, если он не существует, удалите верхний проверочный код. –

ответ

2

Использование var так:

foreach (var type in dataList) 
{ 
    sw.WriteLine(type.ToString()); 
} 
+0

Работал лечения. Должно было быть очевидно. Благодарю. –

0

Вы должны попробовать литья свою коллекцию в foreach с помощью Cast<T>. как это:

public static void WriteDataListToFile<T>(T dataList, string folderPath, string fileName) where T : IEnumerable, ICollection 
{  
    //Check to see if file already exists 
    if(!File.Exists(folderPath + fileName)) 
    { 
     //if not, create it 
     File.Create(folderPath + fileName); 
    } 

    using(StreamWriter sw = new StreamWriter(folderPath + fileName)) 
    { 
     // added Cast<T> 
     foreach(T type in dataList.Cast<T>()) 
     { 
      sw.WriteLine(type.ToString()); 
     } 
    } 
} 
4

Вы dataList должны быть IEnumerable<T>

public static void WriteDataListToFile<T>(IEnumerable<T> dataList, string folderPath, string fileName) 
{ 
    //Check to see if file already exists 
    if (!File.Exists(folderPath + fileName)) 
    { 
     //if not, create it 
     File.Create(folderPath + fileName); 
    } 

    using (StreamWriter sw = new StreamWriter(folderPath + fileName)) 
    { 
     foreach (T type in dataList) 
     { 
      sw.WriteLine(type.ToString()); 
     } 
    } 
} 
1

Вы пытаетесь ввести каждый элемент внутри списка, как T, но ваши ограничения типа заставляют T быть IEnumerable. Я думаю, что вы хотите указать свой параметр как IEnumerable<T> и снять ограничения типа:

public static void WriteDataListToFile<T>(IEnumerable<T> dataList, string folderPath, string fileName) //no type constraints 
{ 
    //your other things 
    foreach(T type in dataList) 
    { 
     sw.WriteLine(type.ToString()); 
    } 
} 
Смежные вопросы