Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射将值从XML加载到结构中_C#_Arrays_Xml_Reflection - Fatal编程技术网

C# 使用反射将值从XML加载到结构中

C# 使用反射将值从XML加载到结构中,c#,arrays,xml,reflection,C#,Arrays,Xml,Reflection,我使用反射将一些值从XML加载到结构中。一切正常,但我在管理阵列时遇到了问题。使用Int32是可以的,但是如何管理Int32[] 编辑:这是我的代码。。。由于长度原因,它不完整。。。我想改进数组类型的保存和加载 //My struct ... it should be a class too public struct stOptions { public int IntNumber; public double DoubleNu

我使用反射将一些值从XML加载到结构中。一切正常,但我在管理阵列时遇到了问题。使用Int32是可以的,但是如何管理Int32[]

编辑:这是我的代码。。。由于长度原因,它不完整。。。我想改进数组类型的保存和加载

    //My struct ... it should be a class too
    
    public struct stOptions
    {
        public int IntNumber;
        public double DoubleNumber;
        public string String;
        public Point aPoint;
    }

    //How my class works
    
    private void Form1_Load(object sender, EventArgs e)
    {
        stOptions options = new stOptions();
        //Populate the struct  
        options.aPoint = new Point(12, 24);
        options.DoubleNumber = 34d;
        options.IntNumber = 17;
        options.String = "Hello";

        ManageSettings ms = new ManageSettings();

        ms.SaveSettings("e:\\test001.xml", options);

        options = default(stOptions);

        options = ms.LoadSettings<stOptions>("e:\\test001.xml");
    }

    //A portion of my class

    public T LoadSettings<T>(string FileName)
    {
        Type type = typeof(T);
        var returnObject = Activator.CreateInstance(type);
        List<Settings> list = null;

        try
        {
            using (StreamReader reader = File.OpenText(FileName))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(List<Settings>));
                list = (List<Settings>)serializer.Deserialize(reader);
            }
        }
        catch
        {
            //Error accessing the file
            _errors.Add("Unable to locate the file or access denied: " + FileName);
            return default(T);
        }

        try
        {
            foreach (Settings entry in list)
            {
                FieldInfo field = returnObject.GetType().GetField(entry.Key.ToString());
                if (field != null)
                {
                    SetField(field, entry.Value.ToString(), returnObject);
                }
                field = null;

                PropertyInfo prop = returnObject.GetType().GetProperty(entry.Key.ToString());
                if (prop != null)
                {
                    SetField(prop, entry.Value.ToString(), returnObject);
                }
                prop = null;
            }
            list = null;
        }
        catch
        {
            //Error processing the XML
            _errors.Add("Errore processing the XML file: " + FileName);
            return default(T);
        }
        return (T)returnObject;
    }
    
    private void SetField(FieldInfo prop, string value, object returnObject)
    {
        switch (prop.FieldType.Name.ToLower())
        {
            case "uint16":
                prop.SetValue(returnObject, Convert.ToUInt16(value));
                break;

            case "uint32":
                prop.SetValue(returnObject, Convert.ToUInt32(value));
                break;
                
            etc.
            [...]
            
            default:
                //An unmanaged type
                Debug.WriteLine("Found an unmanaged type: " + prop.FieldType.Name);
                break;
        }
    }
//我的结构。。。它也应该是一门课
公共结构停止
{
公共整数;
公众双倍号码;
公共字符串;
公共点;
}
//我的班级是如何运作的
私有void Form1\u加载(对象发送方、事件参数e)
{
停止选项=新停止();
//填充结构
options.aPoint=新点(12,24);
options.DoubleNumber=34d;
options.IntNumber=17;
options.String=“Hello”;
ManageSettings ms=新的ManageSettings();
ms.SaveSettings(“e:\\test001.xml”,选项);
选项=默认值(停止);
选项=ms.LoadSettings(“e:\\test001.xml”);
}
//我班的一部分
公共T加载设置(字符串文件名)
{
类型=类型(T);
var returnObject=Activator.CreateInstance(类型);
List=null;
尝试
{
使用(StreamReader=File.OpenText(文件名))
{
XmlSerializer serializer=新的XmlSerializer(typeof(List));
list=(list)序列化程序。反序列化(reader);
}
}
抓住
{
//访问文件时出错
_错误。添加(“无法找到文件或访问被拒绝:+FileName”);
返回默认值(T);
}
尝试
{
foreach(列表中的设置条目)
{
FieldInfo field=returnObject.GetType().GetField(entry.Key.ToString());
如果(字段!=null)
{
SetField(字段,entry.Value.ToString(),returnObject);
}
字段=空;
PropertyInfo prop=returnObject.GetType().GetProperty(entry.Key.ToString());
如果(prop!=null)
{
设置字段(prop,entry.Value.ToString(),returnObject);
}
prop=null;
}
列表=空;
}
抓住
{
//处理XML时出错
_添加(“处理XML文件时出错:“+FileName”);
返回默认值(T);
}
return(T)returnObject;
}
私有void设置字段(FieldInfo属性、字符串值、对象返回对象)
{
开关(prop.FieldType.Name.ToLower())
{
案例“uint16”:
prop.SetValue(returnObject,Convert.ToUInt16(value));
打破
案例“uint32”:
prop.SetValue(returnObject,Convert.ToUInt32(value));
打破
等
[...]
违约:
//非托管类型
WriteLine(“找到非托管类型:”+prop.FieldType.Name);
打破
}
}

完成后,我将发布它。

为什么不阅读xml文件并自动将其转换为C#类?就像在这里看到的:布鲁诺,你的解决方案很好,90%的效果。当我尝试序列化字体时,它失败了,因为它没有没有没有参数的构造函数。当我试图序列化一个颜色变量时,XML文件中没有写入任何值。您好,您能提供一个您正在做的代码示例吗?也许用更新的代码编辑您的文章?我的目标是创建一个简单的结构或类,其中包含一些公共字段和/或公共属性,然后保存并重新加载它。我将从传递给函数的对象(结构或类)创建一个列表,然后将其序列化。然后我将使用反射重新加载所有数据。我可以发送我所有的代码,但有很多行代码。。。我可以吗?我是新用户。。。很抱歉,感谢您的耐心。您不需要使用反射来从XML检索值,下面我将为您提供一个完整的工作代码示例。我希望它能为您提供一个好的方向。您为什么不阅读xml文件并自动将其转换为C#类呢?就像在这里看到的:布鲁诺,你的解决方案很好,90%的效果。当我尝试序列化字体时,它失败了,因为它没有没有没有参数的构造函数。当我试图序列化一个颜色变量时,XML文件中没有写入任何值。您好,您能提供一个您正在做的代码示例吗?也许用更新的代码编辑您的文章?我的目标是创建一个简单的结构或类,其中包含一些公共字段和/或公共属性,然后保存并重新加载它。我将从传递给函数的对象(结构或类)创建一个列表,然后将其序列化。然后我将使用反射重新加载所有数据。我可以发送我所有的代码,但有很多行代码。。。我可以吗?我是新用户。。。很抱歉,感谢您的耐心。您不需要使用反射来从XML检索值,下面我将为您提供一个完整的工作代码示例。我希望它能给你一个好的方向。