可以在泛型方法中约束输出吗?

时间:2011-09-15 18:45:08

标签: c# generics

我有一个界面,定义了对数据的各种过滤(来自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而不是FooBar。是否有一些简单的方法来转换此输出,还是我需要放弃通用方法?

1 个答案:

答案 0 :(得分:0)

假设FooBar类都可以转换为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

其中IFooBarFooBar的基类/接口