自从这个答案出现以来已经有一段时间了,但以防万一有人还在寻找答案......
我遇到了类似的问题。我的场景是 BindingSource.DataSource 将始终绑定到 IEnumerable 但列表中可能没有任何项目。事实证明,BindingSource 有一个名为“itemType”的私有实例成员。此字段正是您要查找的内容:如果 BindingSource 绑定到列表,则显示列表的元素类型;如果没有列表,则显示 BindingSource 绑定到的对象的类型。
为了访问字段值,我使用了一些 hacky 反射:
FieldInfo fi =
typeof(BindingSource)
.GetField("itemType", BindingFlags.NonPublic | BindingFlags.Instance);
Type myElementType = fi.GetValue(DataBinder.RestrictedDataBinding) as Type;
没有做太多研究,我有点假设它正在做的是显示 innerList 的元素类型,这就是为什么 DataSource 是否是列表类型并不重要。此外,我假设此字段将准确显示 BindingSource 支持的任何类型列表的元素类型(包括 IQueryables 等)。
警告:我没有对这个字段进行太多测试,所以我不知道是否存在使其无法读取正确元素类型的情况。例如,重置 BindingSource 的 DataSource 属性时,字段是否总是准确更新?如果将 DataSource 属性重置为具有不同 elementType 的列表怎么办?就我而言,这些例外和其他例外不适用,但您可能想测试它们。
最后,使用反射侵入私有字段会破坏各种 oop 原则。记住这一点。另外,请记住,itemType 字段被隐藏很可能是有充分理由的。如果您需要进一步调查,BindingSource 类的代码是公开的。