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

use*_*672 6 c# reflection

我有一些像这样的代码,我不知道什么类型,直到运行时.

Type type;
Run Code Online (Sandbox Code Playgroud)

我需要一个定义为的列表:

List<type>
Run Code Online (Sandbox Code Playgroud)

我试过了

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

IList list = Activator.CreateInstance(listType));
Run Code Online (Sandbox Code Playgroud)

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

例如:当我进入时

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

它输出

<ArrayOfString>...</ArrayOfString>
Run Code Online (Sandbox Code Playgroud)

我进去的时候

IList list = new List<String>()

它会输出

<ArrayOfAnyType>...</ArrayOfAnyType>
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

当我不知道编译时的类型时,如何定义List?

Lee*_*Lee 4

我假设您正在使用以下命令创建序列化器:

var serialiser = new XmlSerializer(typeof(IList));
Run Code Online (Sandbox Code Playgroud)

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

var serialiser = new XmlSerializer(list.GetType());
Run Code Online (Sandbox Code Playgroud)

请注意以下工作按预期进行:

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();
Run Code Online (Sandbox Code Playgroud)