列表,反射,IEnumerable和配置问题

时间:2012-11-23 19:29:29

标签: c# collections reflection

我正在尝试使用反射来检测List<T>等集合。最终我需要在没有可用实例的情况下运行(即仅通过typeof),并希望检测超出List<T>的集合,但为了使其简单,这是一个基本的测试用例失败:

Type type = (new List<string>()).GetType();
if (type.IsAssignableFrom(typeof(System.Collections.IEnumerable)))
{
    Console.WriteLine("True.");
}
else Console.WriteLine("False.");

我也尝试IListICollection无济于事。

在排除故障时我遇到了以下讨论: Why is List<int> not IEnumerable<ValueType>?

该讨论的OP发现了他的答案,即上述之类的东西不会检测到值类型,因为协方差对它们不起作用。但是我使用字符串,参考类型,仍然没有看到协方差。对我来说更好奇的是,当我在上面的讨论中运行示例代码时,我看到了一个非常不同的结果:

System.Collections.Generic.List`1[AssignableListTest.Program+X] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[System.String] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[AssignableListTest.Program+Z] is most likely a list of ValueTypes or a string
System.Collections.Generic.List`1[System.Int32] is most likely a list of ValueTypes or a string
blah is most likely a list of ValueTypes or a string
1 is not a list

让我相信我必须与该海报有一个配置差异。我正在使用Visual Studio 2005,在这种情况下使用.NET 3.5,但如果可能的话我需要兼容性回到2.0。实际上,如果我能得到海报的结果,那就足够了(确定IEnumerable已经实施),但是当我使用Type.IsAssignableFrom()代替“是”时,他们都会“不是”列表“。

1 个答案:

答案 0 :(得分:6)

你需要翻转支票:

type.IsAssignableFrom(typeof(System.Collections.IEnumerable))

变为

typeof(System.Collections.IEnumerable).IsAssignableFrom(type)

每个人至少犯过一次这个错误。这是一个误导性的API。