如何为运行时类型创建List <type>?</type>

时间:2014-03-09 23:10:26

标签: c# reflection

我有一些像这样的代码,我不知道在运行之前是什么类型。

Type type;

我需要一个定义为:

的列表
List<type>

我试过

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

IList list = Activator.CreateInstance(listType));

但它不能很好地工作,因为我需要将此列表传递给XmlSerializer.Serialize方法。 当此列表完全定义为List

时,它仅输出正确的结果

例如: 当我通过

List<String> list = new List<String>()

输出

<ArrayOfString>...</ArrayOfString>

当我通过时

IList list = new List<String>()

将输出

<ArrayOfAnyType>...</ArrayOfAnyType>

这不是我想要的。

如果在编译时不知道什么类型,我如何定义List?

1 个答案:

答案 0 :(得分:4)

我假设您正在创建序列化程序:

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();