IQueryable的<>扩展方法

时间:2011-04-07 09:39:44

标签: c# .net interface iqueryable

我有两个问题基本上是指相同的范围:

  1. 我的具体问题:

    我有2个课程:用户,汽车 我想添加返回IQueryable<>的create extension方法,并对两种类型使用相同的方法。 有可能吗?

  2. 更一般的问题: 使用泛型我可以返回任何对象类型。是否可以将返回类型限制为特定类型(仅限我的用户和汽车类)?

  3. 谢谢

2 个答案:

答案 0 :(得分:4)

如果Users和Cars共享相同的祖先或实现公共接口,则可以创建适用于这两个类的扩展方法。

public interface X {}

public class Car : X {}

public class User : X {}

public static class Xtensions
{
   public static Xtension( this X target ) {}
}

我看不到你的代码,但我想知道这是不是代码味道......

但是,如果您可以访问代码/类,为什么不这样做:

public class X
{
    public virtual void CommonStuff() { }
}

public class Car : X {}

public class User : X {}

通过使CommonStuff为虚拟,您可以在任何特定情况下覆盖实现(如有必要)。

可以限制泛型:查看this文章。

答案 1 :(得分:1)

如果User和Care基于相同的基类,比如Base,则可以执行以下操作:

   MyGenericType<T> where T : Base

通常,您可以指定Base,无论您指的是User还是Car。在扩展方法或其他方法中。相同。

但是,如果User和Car不共享相同的基类,那么您必须实现一个通用接口将它们绑定在一起。例如:

class User : IMyInterface...
class Car : IMyInterface...

MyGenericType<T> where T : IMyInterface

你必须有某些东西才能将两个类绑在一起。否则,您不能只指定任何两个类以供编译器强制执行。