2013-11-27 2 views
1

Я написал программу, которая делает работу с файлами, такими как удаление и обновление, магазин и поиск И все клиенты, сотрудники и порядок ...Трудного Deserialize Метод IndexOutOfRangeException

Но моя проблема с методом десериализации и знает, когда это называется я получаю эту ошибку:

IndexOutOfRangeException

Я попробовал метод Try Поймайте, но это делает программа медленно п снижает его эффективность

Project Files

Video

public T Deserialize<T>(string entity) 
    { 
     var obj = Activator.CreateInstance<T>(); 
     var stringProps = entity.Split(','); 
     var objProps = obj.GetType().GetProperties(); 

     var propIndex = 0; 

     for (int i = 0; i < stringProps.Length - 1; i++) 
     { 
      try 
      { 
       if (objProps[propIndex].PropertyType.FullName == "System.String") 
       { 
        objProps[propIndex].SetValue(obj, stringProps[i], null); 
       } 

       else if (objProps[propIndex].PropertyType.FullName == "System.Int32") 
       { 
        objProps[propIndex].SetValue(obj, Convert.ToInt32(stringProps[i]), null); 
       } 
       else if (objProps[propIndex].PropertyType.FullName == "System.DateTime") 
       { 
        var cultureInfo = new CultureInfo("fa-IR"); 
        DateTime dateTime = Convert.ToDateTime(stringProps[i], cultureInfo); 
        objProps[propIndex].SetValue(obj, dateTime, null); 
       } 
       else if (objProps[propIndex].PropertyType.FullName == "System.boolean") 
       { 
        objProps[propIndex].SetValue(obj, Convert.ToBoolean(stringProps[i]), null); 
       } 

       else 
       { 
        i--; 
       } 
       propIndex++; 
      } 

      catch (IndexOutOfRangeException) 
      { 
       Debug.WriteLine("Index Out Of range"); 
      } 
     } 
     return obj; 
    } 
+0

Так в чем ваш вопрос? Вы хотите исправить свою программу, чтобы она работала и больше не выбрасывает это исключение? Или вы в порядке с исключением и просто хотите справиться с этим более эффективно? Если последнее, то вы можете просто иметь пустой 'catch'. Я подозреваю, однако, что у вас есть логическая ошибка, и вам нужно это исправить. –

+0

Да, вы хотите исправить вашу программу, чтобы она работала и больше не выбрасывает это исключение. –

+0

Редактировать свой вопрос. Покажите примерный класс, который вы хотите инициализировать, и покажите пример данных, которые вы пытаетесь десериализовать. Покажите определение класса и содержимое массива 'stringProps'. –

ответ

1

Я написал функцию (deleteespace), которая имеет задачу удаления пробелов в строке, и проблема была решена с помощью этого метода.

public T Deserialize<T>(string entity) 
    { 
     var obj = Activator.CreateInstance<T>(); 
     var stringProps = entity.Split(','); 
     **var str = deletespace(stringProps);** 
     var objProps = obj.GetType().GetProperties(); 

     var propIndex = 0; 

     for (int i = 0; i < str.Count; i++) 
     { 
      try 
      { 
       if (objProps[propIndex].PropertyType.FullName == "System.String") 
       { 
        objProps[propIndex].SetValue(obj, stringProps[i], null); 
       } 

       else if (objProps[propIndex].PropertyType.FullName == "System.Int32") 
       { 
        objProps[propIndex].SetValue(obj, Convert.ToInt32(stringProps[i]), null); 
       } 
       else if (objProps[propIndex].PropertyType.FullName == "System.DateTime") 
       { 
        var cultureInfo = new CultureInfo("fa-IR"); 
        DateTime dateTime = Convert.ToDateTime(stringProps[i], cultureInfo); 
        objProps[propIndex].SetValue(obj, dateTime, null); 
       } 
       else if (objProps[propIndex].PropertyType.FullName == "System.Boolean") 
       { 
        objProps[propIndex].SetValue(obj, Convert.ToBoolean(stringProps[i]), null); 
       } 

       else 
       { 
        i--; 
       } 
       propIndex++; 
      } 

      catch (IndexOutOfRangeException) 
      { 
       Debug.WriteLine("Index Out Of range"); 
      } 
     } 
     return obj; 
    } 

    **private List<string> deletespace(string[] spaceStrings) 
    { 
     var lststr = new List<string>(); 
     for (int i = 0; i < spaceStrings.Length; i++) 
     { 
      if (spaceStrings[i] != "") 
      { 
       lststr.Add(spaceStrings[i]); 
      } 
     } 
     return lststr; 
    }** 
+1

Вместо этого вы могли бы написать «var stringProps = entity.Split (',', StringSplitOptions.RemoveEmptyEntries);' См. [Метод String.Split] (http://msdn.microsoft.com/en-us/library /ms131448(v=vs.110).aspx) –

1

Вы пропустили проверить погоду ваш propIndex находится в пределах вашего objProps массива.

Вы можете сделать следующие изменения в код:

for (int i = 0; 
    i < stringProps.Length - 1 
     && propIndex < objProps.Length - 1; // <-- check wether you're in range 
    i++) 

Другим способом было бы поставить блок попытаться поймать за пределами цикл, так что вы не итерация больше stringProps, когда IndexOutOfRangeException начинает происходят.

Таким образом, вы сохраняете регистрацию ошибок.

+0

Это позволяет избежать ошибки, но это не делает работу программы. Похоже, что ОП имеет фундаментальное непонимание того, как делать то, что он хочет делать. –

+0

Правильно, но то, что он изначально хотел получить, неизвестно. Разумеется, он должен реализовывать некоторую обработку ошибок, как лучше всего в предложении catch. – abto

Смежные вопросы