C# 泛型集合多态类型作为参数

C# 泛型集合多态类型作为参数,c#,generics,data-binding,casting,C#,Generics,Data Binding,Casting,考虑以下结构 class A {} class B : A {} class C : A {} class D : A {} ... // in data source class BindingList<B> d1; BindingList<C> d2; BindingList<D> d3; ... // in datagridview class void BindDataSource(BindingList<A> source); voi

考虑以下结构

class A {}
class B : A {}
class C : A {}
class D : A {}
...

// in data source class
BindingList<B> d1;
BindingList<C> d2;
BindingList<D> d3;
...

// in datagridview class
void BindDataSource(BindingList<A> source);
void QueryDataSource() {
  BindingList<A> source = (BindingList<A>)dgv.DataSource;
  A a = source.First(...);
}
但是现在
QueryDataSource
无法编译,因为我无法转换数据源。有什么办法可以解决整个问题吗?

有几个选择

选项1:让d1…d3成为
BindingList
实例,但只插入B,C, 我喜欢他们

选项2:拥有一个集合,并按查询/筛选 B、 C和D(需要时)

选项3:这样做

BindDataSource(
    new BindingList<A>(d1.ToList<A>())
)
BindDataSource(
新绑定列表(d1.ToList())
)
选项4:使用通用方法

void BindDataSource<T>(BindingList<T> list) where T : A { }
void BindDataSource(BindingList列表),其中T:A{}

根据您的示例,如果您只使用LINQ进行查询,那么为什么不将
数据源
转换为
IEnumerable
(您的链接问题表明了这一点)
IEnumerable
是联合变量,所有3个列表都是
IEnumerable
。。
void BindDataSource<T>(BindingList<T> list) where T : A { }