【问题标题】:How to XML serialize a class Type using reflection?如何使用反射对类类型进行 XML 序列化?
【发布时间】:2015-02-13 07:02:06
【问题描述】:

在通过反射获取类后,我正在尝试对类进行 XML 序列化。任何人都可以建议我确切的方法。下面是我的代码。

Assembly myassembly = Assembly.LoadFile(myassemblypath);
List<Type> types = myassembly .GetTypes().Where(x => x.BaseType == typeof(myType));
foreach (Type item in types)
{
 dynamic instance = Activator.CreateInstance(item);
 using (var writer = new StringWriter())
{
 new XmlSerializer(item.GetType()).Serialize(writer, instance);
string xmlEncodedList = writer.GetStringBuilder().ToString();
Console.WriteLine(xmlEncodedList);
 }
}

此代码不起作用,它给了我异常。

【问题讨论】:

  • 我认为您不会那么容易对其进行序列化。您可能只想自己编写一个 XDoc。不过,告诉我们您到底遇到了什么异常会很有帮助...
  • 什么是异常,哪一行导致异常?
  • item.GetType() 因为它返回 System.RuntimeType

标签: c# .net xml serialization


【解决方案1】:

当您收到 system.RuntimeType 异常时,要获取实际类型,您需要从 RuntimeType 解开实际类型,这将解决您的问题。

以下是解开实际类型的代码

 var runTimeObj = Activator.
               CreateInstance(assemblyName, assemblyName + "." + className);
 //T is generic type as i m using genric
 //but point of interest here is unwrap method to get actual type
 var dataProvider = (T)runTimeObj.Unwrap();

再举一个例子

  ObjectHandle handle = Activator.CreateInstance("PersonInfo", "Person");
  Object p = handle.Unwrap();
  Type t = p.GetType();

你的代码使用dynamic还有一个问题不要使用它使用ObjectHandle...如示例中给出的那样

解包检查:https://msdn.microsoft.com/en-us/library/d133hta4%28v=vs.110%29.aspx

【讨论】:

  • 如何解开我使用反射获得的类型?
  • @user2822362 - 你可以像我一样使用 Unwrap 方法
  • @user2822362 - 你也可以在这里查看:msdn.microsoft.com/en-us/library/d133hta4%28v=vs.110%29.aspx
  • 我认为我的程序集存在一些问题,现在它抛出我无法加载类型异常。
  • @user2822362 - 好的,如果它可以解决与此相关的原始问题,请不要忘记将解决方案标记为已接受...
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2020-12-09
相关资源
最近更新 更多