【问题标题】:How do I create List<type> for runtime type?如何为运行时类型创建 List<type>?
【发布时间】:2014-03-10 07:26:45
【问题描述】:

我有一些这样的代码,直到运行时我才知道是什么类型。

Type type;

我需要一个列表定义为:

List<type>

我试过了

var listType = typeof(List<>).MakeGenericType(new []{type});

IList list = Activator.CreateInstance(listType));

但它不能很好地工作,因为我需要将此列表传递给 XmlSerializer.Serialize 方法。 只有当这个列表完全定义为List时才会输出正确的结果

例如: 当我通过时

List&lt;String&gt; list = new List&lt;String&gt;()

输出

<ArrayOfString>...</ArrayOfString>

当我通过时

IList list = new List&lt;String&gt;()

会输出

<ArrayOfAnyType>...</ArrayOfAnyType>

这不是我想要的。

当我不知道编译时是什么类型时,如何定义一个列表?

【问题讨论】:

  • 不确定我是否真正理解了这个问题。但是如果你想要一个列表,你可以调用一个 ToList() 来将你的集合转换为一个列表吗?假设 activator.createInstance 返回一些 IEnumerable... var list = Activator.CreateInstance(listType).ToList();
  • 您的标题和标签确实不适合您的问题。您似乎能够正确输入运行时List&lt;&gt;。您确实遇到了运行时类型和XMLSerializer 的问题。使用更好的标题和更好的标签,您可能会得到更好的答案。
  • 你传递给XmlSerializer的构造函数的类型是什么?
  • 我实际上并没有意识到问题在于人们如何初始化 XmlSerializer,因为它是在很久以前创建的一个类中。谢谢大家!!

标签: c# reflection


【解决方案1】:

我假设您正在使用以下方式创建序列化程序:

var serialiser = new XmlSerializer(typeof(IList));

你应该传递真正的列表类型:

var serialiser = new XmlSerializer(list.GetType());

请注意以下按预期工作:

var t = typeof(List<>).MakeGenericType(typeof(string));
var list = (System.Collections.IList)Activator.CreateInstance(t);
list.Add("string1");
list.Add("string2");

var serialiser = new System.Xml.Serialization.XmlSerializer(list.GetType());
var writer = new System.IO.StringWriter();
serialiser.Serialize(writer, list);

var result = writer.GetStringBuilder().ToString();

【讨论】:

  • 谢谢伙计,你拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多