如何使用列表<类型>中的类型?

Rob*_*och 2 c# linq generics list

我想通过使用类型和保持简单来使我的代码基于约定,但泛型具有自己的复杂性和它自己的学习曲线.

我在List中有一堆POCO(普通旧CLR对象),我想在代码中稍后进行迭代.

var models = new List<Type>();
models.Add(typeof(Person));
models.Add(typeof(Company));
Run Code Online (Sandbox Code Playgroud)

想循环遍历每个列表项:

models.ForEach(m =>
{
    var label = m.FullName;
    // var data = JsonConvert.DeserializeObject<List<typeof(m)>>(""); // doesn't work
    var data = JsonConvert.DeserializeObject<List<m>>(""); // doesn't work either
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是反序列化行中的"m"不起作用.传递它的最佳方法是什么,即将'List <m>'设为'List <T>'我们可以使用?

Jam*_*iec 7

要使用泛型,你真的需要T编译时知道Type(),你不需要 - 你知道它在运行时.(警告:它有可能带有反射,但如果出现过载则不需要使用它,如下所述)

有一个重载DeserializeObject需要Type而不是使用泛型.所以你的代码就是

models.ForEach(m =>
{
    var label = m.FullName;
    var data = JsonConvert.DeserializeObject("",m);
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,正如您在评论中指出的那样,您实际上需要的List<T>不是单一的T.你需要一点反思,只需创建一个正确的类型来传递给上面的DeserializeObject调用.

var tList = typeof(List<>);  // Type of open List
models.ForEach(m =>
{
    var label = m.FullName;
    var tConvert = = tList.MakeGenericType(m); 
    var data = JsonConvert.DeserializeObject("",tConvert);
    ...
}
Run Code Online (Sandbox Code Playgroud)

在回答你的问题的正上方,但更多的我看着它,它是很难看到什么,你可以真正做到data.所有你知道的data是它是一个object.你不能把它扔到任何东西 - 你不会知道它的列表Person或列表Company.

也许这是一个过于人为的例子,你已经习惯了现实生活中的问题.如果不是我预见到你的下一个问题是该怎么做data!!