C# 困难的反序列化方法IndexOutoFrangException

C# 困难的反序列化方法IndexOutoFrangException,c#,deserialization,C#,Deserialization,我写了一个程序,可以处理诸如删除和更新、存储和搜索以及所有客户、员工和订单等文件 但我的问题是,当调用反序列化方法时,我发现以下错误: 索引自动失效异常 我尝试过Try-Catch方法,但它会使程序变慢,从而降低其效率 public T反序列化(字符串实体) { var obj=Activator.CreateInstance(); var stringProps=entity.Split(','); var objProps=obj.GetType().GetProperties(); v

我写了一个程序,可以处理诸如删除和更新、存储和搜索以及所有客户、员工和订单等文件

但我的问题是,当调用反序列化方法时,我发现以下错误:

索引自动失效异常

我尝试过Try-Catch方法,但它会使程序变慢,从而降低其效率

public T反序列化(字符串实体)
{
var obj=Activator.CreateInstance();
var stringProps=entity.Split(',');
var objProps=obj.GetType().GetProperties();
var-propIndex=0;
对于(int i=0;i
您没有检查您的
ProIndex
是否在您的
objProps
数组的范围内

您可以对代码进行以下更改:

for (int i = 0;
     i < stringProps.Length - 1 
         && propIndex < objProps.Length - 1; // <-- check wether you're in range
     i++)
for(int i=0;
i
 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;
    }**
public T反序列化(字符串实体)
{
var obj=Activator.CreateInstance();
var stringProps=entity.Split(',');
**var str=删除空间(stringProps)**
var objProps=obj.GetType().GetProperties();
var-propIndex=0;
对于(int i=0;i
那么你的问题是什么?你想修复你的程序,使它工作并且不再抛出异常吗?或者你对异常没问题,只是想更有效地处理它吗?如果是后者,那么你可以只得到一个空的
catch
。不过,我怀疑你有一个逻辑错误,你需要修复它。是的,你想吗修复您的程序,使其工作,不再引发该异常。编辑您的问题。显示您要初始化的示例类,并显示您尝试反序列化的数据示例。显示类定义和
stringProps
数组的内容。这样可以避免错误,但不会使程序工作。I似乎OP对如何做他想做的事情有一个根本性的误解。是的,但他最初想要得到的是什么还不知道。当然他必须实现一种错误处理,就像catch子句中最好的那样。相反,你可以编写
var stringProps=entity.Split(',',,StringSplitOptions.removemptyEntries);
请参见
 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;
    }**