我编写了一个程序,可以处理删除和更新,存储和搜索等文件以及所有客户,员工和订单......
但我的问题是deserialize方法你知道什么时候它被称为我得到这个错误:
IndexOutOfRangeException
我尝试过Try Catch方法但它会使程序变慢n会降低效率
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 :(得分:1)
您错过了检查propIndex
是否在objProps
阵列的范围内。
您可以对代码进行以下更改:
for (int i = 0;
i < stringProps.Length - 1
&& propIndex < objProps.Length - 1; // <-- check wether you're in range
i++)
另一种方法是将try catch块放在for循环之外,以便在stringProps
开始出现时不再迭代IndexOutOfRangeException
。
这样就可以记录错误。
答案 1 :(得分:1)
我写了一个函数(deletespace),它的任务是删除字符串中的空格,并且用这个方法解决了问题。
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;
}**