【问题标题】:c#: Convert object to a generic listc#:将对象转换为通用列表
【发布时间】:2018-05-18 09:54:21
【问题描述】:

我有一个数据结构,其中变量的类型为object。但是,我知道在运行时这个对象肯定是List<T>,其中T 应该涵盖多种情况(例如,intstring,...)。在下面的代码中,我想使用List<T> 特有的功能,比如Linq 函数。

通过以下检查,我确定这是一个列表:

if (constantExpression.Value.GetType().GetGenericTypeDefinition() == typeof(List<>)) 
{
    // Want to use Linq here
}

这可能吗?不幸的是,我在网上找不到任何有用的东西。

【问题讨论】:

  • 显式声明为 (List)?
  • 理论上是可行的,但需要很多尴尬的反思。由于您在编译时不知道T,因此您不能真正将object 转换为List&lt;T&gt;。所以你必须通过反射找到正确的 linq 扩展,并使用MakeGenericMethod 来创建正确的通用版本。
  • @AndrejHafner 你如何转换为 generic 类型?如果您在编译时不知道T,则无法进行转换。
  • 之后你想使用什么样的 linq 函数?我正在努力思考你可以用它做什么样的 LINQ 操作,而不涉及知道 T 是什么......
  • @Chris 好的。谢谢你的评论。我将采用 Konamiman 提出的以下解决方案

标签: c# .net generics type-conversion


【解决方案1】:

如果您可以将列表作为List&lt;object&gt;() 处理,您可以执行以下操作:

var listOfObjects = ((IEnumerable)constantExpression.Value).Cast<object>();

这远非完美,但如果您不想按照 cmets 中的建议使用反射或使用 dynamic,这可能是您能得到的最好结果。

【讨论】:

  • 这很好用。动态的解决方案也是如此。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多