【问题标题】:IQueryable<> extension MethodIQueryable<> 扩展方法
【发布时间】:2011-04-07 09:39:43
【问题描述】:

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

  1. 我的具体问题:

    我有 2 个类:用户、汽车 我想添加返回 IQueryable 的创建扩展方法,并对两种类型使用相同的方法。 有可能吗?

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

谢谢

【问题讨论】:

  • 如果您可以访问代码,为什么要编写扩展方法?将方法包含在类本身中肯定会更好吗?
  • 为什么要创建扩展方法而不是直接类方法?
  • @Matt Ellen,可能是他正在编译两个 DLL,其中一个(包含扩展方法)是可选的......但无论如何 +1。
  • @Stephen Chung:是的,我想可能是因为功能升级是可选的。

标签: c# .net interface iqueryable


【解决方案1】:

如果 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 文章。

【讨论】:

    【解决方案2】:

    如果 User 和 Care 基于同一个基类,比如 Base,那么您可以执行以下操作:

       MyGenericType<T> where T : Base
    

    一般来说,您可以指定 Base,无论您是指 User 还是 Car。在扩展方法或其他方法中。一样。

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

    class User : IMyInterface...
    class Car : IMyInterface...
    
    MyGenericType<T> where T : IMyInterface
    

    你必须有一些东西将这两个类联系在一起。否则,您不能只指定任意两个类让编译器强制执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多