c#:将对象转换为通用列表

c#:将对象转换为通用列表,c#,.net,generics,type-conversion,C#,.net,Generics,Type Conversion,我有一个数据结构,其中一个变量的类型是object。但是,我知道在运行时,这个对象肯定是一个列表,其中T应该涵盖多种情况(例如,int,字符串,…)。在下面的代码中,我想使用特定于的功能,例如Linq函数 通过以下检查,我确定这是一个列表: if (constantExpression.Value.GetType().GetGenericTypeDefinition() == typeof(List<>)) { // Want to use Linq here } if(

我有一个数据结构,其中一个变量的类型是
object
。但是,我知道在运行时,这个对象肯定是一个
列表
,其中
T
应该涵盖多种情况(例如,
int
字符串
,…)。在下面的代码中,我想使用特定于
的功能,例如Linq函数

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

if (constantExpression.Value.GetType().GetGenericTypeDefinition() == typeof(List<>)) 
{
    // Want to use Linq here
}
if(constantExpression.Value.GetType().GetGenericTypeDefinition()==typeof(列表))
{
//想在这里使用Linq吗
}

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

如果您可以将列表作为
列表()处理,您可以执行以下操作:

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

这还远远不够完美,但如果您不想像评论中建议的那样使用反射或使用
动态
,这可能是您能得到的最好结果。

如果您可以将列表作为
列表处理()
,您可以执行以下操作:

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

这还远远不够完美,但如果你不想像评论中所建议的那样使用反射或使用
动态
,这可能是你能得到的最好结果。

明确声明为(列表)?这在理论上是可能的,但需要很多尴尬的反射。由于您在编译时不知道
t
,因此无法将
对象
强制转换为
列表
。因此,您必须通过反射找到正确的linq扩展,并使用
MakeGenericMethod
创建正确的泛型版本。@AndrejHafner如何强制转换为泛型类型?如果您在编译时不知道
t
,则无法强制转换。以后您希望使用哪种linq函数?我正在努力思考,如果不知道
t
是什么,你可以用它做什么样的LINQ操作…@Chris Ok。谢谢你的评论。我将使用下面由Konamiman提出的解决方案显式地声明为(列表)?这在理论上是可能的,但需要很多尴尬的思考。由于您在编译时不知道
t
,因此无法将
对象
强制转换为
列表
。因此,您必须通过反射找到正确的linq扩展,并使用
MakeGenericMethod
创建正确的泛型版本。@AndrejHafner如何强制转换为泛型类型?如果您在编译时不知道
t
,则无法强制转换。以后您希望使用哪种linq函数?我正在努力思考,如果不知道
t
是什么,你可以用它做什么样的LINQ操作…@Chris Ok。谢谢你的评论。我将采用下面由Konamimant提出的解决方案,效果很好。使用dynamic的解决方案也是如此。非常感谢。这个很好用。使用dynamic的解决方案也是如此。非常感谢。