Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 如何反序列化为动态类型_C#_Xml_Serialization - Fatal编程技术网

C# 如何反序列化为动态类型

C# 如何反序列化为动态类型,c#,xml,serialization,C#,Xml,Serialization,我试图反序列化XML以获得动态创建的类型数组(使用codedom),然后使用反射加载该程序集并加载动态创建的类型。当我尝试反序列化我的XML(它有一个动态生成类型的对象集合)时,我不确定如何向序列化程序提供该类型 我的代码示例: Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll"); Type type = assembly.GetType("myDynamicType");

我试图反序列化XML以获得动态创建的类型数组(使用codedom),然后使用反射加载该程序集并加载动态创建的类型。当我尝试反序列化我的XML(它有一个动态生成类型的对象集合)时,我不确定如何向序列化程序提供该类型

我的代码示例:

        Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll");
        Type type = assembly.GetType("myDynamicType");

        string xmlstring = myXml.OuterXml.ToString();
        byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlstring);
        MemoryStream ms = new MemoryStream(buffer);
        XmlReader reader = new XmlTextReader(ms);

        myDynamicType[] EQs;
        XmlSerializer serializer = new XmlSerializer(typeof(myDynamicType[]));
        EQs = (myDynamicType[])(serializer.Deserialize(reader));
所以,这里的问题是,我在编写代码时不知道“myDynamicType”。它将在运行时创建和编译


请提供帮助。

这里的技巧是
类型的实例上的
Type.MakeArrayType()
方法。无参数版本生成向量类型,即
typeof(Foo).MakeArrayType()
==
typeof(Foo[])
。多维数组等还有其他重载

XmlSerializer serializer = new XmlSerializer(type.MakeArrayType());
然而:你将无法在最后施展它;您需要使用
object[]
或类似工具(使用引用类型的数组变量):


我不知道我要说的是否是你想要的,但是:


不能将其反序列化为对象类型吗

object[] EQs;
XmlSerializer serializer = new XmlSerializer(typeof(object[]));
EQs = (object[])(serializer.Deserialize(reader));
如果对象类型是在编译时定义的(如您所说),那么不应该有一些代码来定义它吗?在这段代码中,您只需将对象转换为您想要的类型

拥有
对象[]eq
后,另一种转换方法如下:

     if(EQs.Lenght > 0)
     {
        Type t = EQs[0].GetType();
     }

现在使用获得的
类型
将您的
对象[]eq
转换为右侧的
类型

您知道编译时的类型吗,还是正在加载完全未知的程序集?你打算如何使用这些对象?不,我不知道编译时的类型。实际上,它将在运行时生成并编译为程序集。因此,可以说我的程序集和我的“myDynamicType”在编译时都是完全未知的。至于进一步的使用,我将把这个数组传递给我的web服务,它将对这个集合执行一些操作。谢谢Marc。但是,如果我将其强制转换为对象[],我将无法将其传递给需要特定类型集合的web服务。@AshishAgrawal如果该类型是动态加载的,您已经遇到了问题。无论您如何键入,它基本上都是该类型的。如果类型是静态已知的,那么坦率地说,所有这些都是毫无意义的。类型不是静态定义的。实际上,正如我所说,我正在使用codedom创建“myDynamicType”。因此,这个字符串是一个变量,它会根据用户的一些输入而改变。例如,若用户说我想创建一个学生类,那个么我的代码将更改为:Student[]EQs;XmlSerializer serializer=新的XmlSerializer(typeof(Student[]);EQs=(学生[])(序列化程序.反序列化(读取器));请让我知道我是否在这里制造了任何混乱。@AshishAgrawal问题是最后一点-等式。对于一个不是(也不能)静态类型的变量,很难做任何有用的事情。您需要使用反射或
动态
。让我试着在这里解释我的确切要求。我有一个web服务,它根据客户机提供的信息(通过url)动态生成wsdl。例如,如果用户试图访问“myServiceHost/myWebService/A.asmx?wsdl”;然后wsdl显示了一些方法,如GetA(A[]records)、CreateA(A[]records)、DeleteA(A[]records)等,其中A将是可序列化的类型。假设用户尝试并访问url myServiceHost/myWebService/B.asmx?wsdl,那么它将显示一些方法,如GetB(B[]记录)、CreateB(B[]记录)、DeleteB(B[]记录)contd“您不能将其反序列化为对象类型吗”-基本上没有
XmlSerializer
需要知道它应该做什么expect@Vincent,实际上我正在使用codedom动态(在运行时)创建该类型。下面是我在运行时获取类型的代码(基于用户的输入)。Type Type=assembly.GetType(“myDynamicType”);因此,myDynamicType不是静态定义的类型。那么它可以是什么类型呢?我们谈论的可能是字符串,也可能是数字。也可以是定制的。更重要的是,你需要用它来计算/做一些事情吗?如果只是为了从xml加载以在屏幕上显示somewere,一个字符串就足够了。@Vincentadvocat它可以是任何自定义类型,并将包含多个方法(请参阅我对上面Marc答案的评论)。我将把这个集合传递给我的web服务(对该集合执行一些操作)。
     if(EQs.Lenght > 0)
     {
        Type t = EQs[0].GetType();
     }