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>'我们可以使用?
要使用泛型,你真的需要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!!
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |