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 { }