我有一个界面,定义了对数据的各种过滤(来自EF4的查询)。
接口方法:
IQueryable<T> filter<T>() where T : class;
现在在该界面的具体实现中,我希望能够:
public IQueryable<T> filter<T>() {
if (...) return query.OfType<Foo>().Take(100);
if (...) return query.OfType<Bar>().Blah();
// etc
}
但当然这不起作用,因为函数签名需要T
而不是Foo
或Bar
。是否有一些简单的方法来转换此输出,还是我需要放弃通用方法?
答案 0 :(得分:0)
假设Foo
和Bar
类都可以转换为T
,这样的方法就可以了:
public IQueryable<T> filter<T>() {
if (...) return query.OfType<Foo>().Take(100).Cast<T>();
if (...) return query.OfType<Bar>().Blah().Cast<T>();
// etc
}
但是,您需要确保它们都可以转换为T
,否则您显然会获得InvalidCastExceptions。因此,您可以通过将声明更改为某些类型来确保T
可以强制转换为任何类型:
public IQueryable<T> filter<T>() where T : IFooBar
其中IFooBar
是Foo
和Bar
的基类/接口