我正在尝试使用反射来检测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.");
我也尝试IList
和ICollection
无济于事。
在排除故障时我遇到了以下讨论: 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()
代替“是”时,他们都会“不是”列表“。
答案 0 :(得分:6)
你需要翻转支票:
type.IsAssignableFrom(typeof(System.Collections.IEnumerable))
变为
typeof(System.Collections.IEnumerable).IsAssignableFrom(type)
每个人至少犯过一次这个错误。这是一个误导性的API。