IQueryable<>扩展方法

发布于 2024-10-30 14:31:36 字数 229 浏览 1 评论 0 原文

我有两个基本上涉及相同范围的问题:

  1. 我的具体问题:

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

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

谢谢

I have two question that basically refer to the same scope:

  1. My specific problem:

    I Have 2 classes: Users, Cars
    I would like to add create extension method which returns IQueryable<>, and use the very same method for both types.
    Is it possible?

  2. More general question:
    Using generics I can return any object type. Is it possible to limit the return type to specific types (only my User and Cars classes)?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

胡渣熟男 2024-11-06 14:31:36

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

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 虚拟,您可以在任何特定情况下重写实现(如果需要)。

可以限制泛型:检查文章。

If Users and Cars share the same ancestor, or implement a common interface, then it is possible to create an extension method that is applicable to both classes.

public interface X {}

public class Car : X {}

public class User : X {}

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

I cannot see your code, but I wonder if this is not going to be a code-smell ...

But, if you have access to the code / classes, why don't you do it like this:

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

public class Car : X {}

public class User : X {}

By making CommonStuff virtual, you can override the implementation in any specific case (if necessary).

Generics can be constrained: check this article.

鸵鸟症 2024-11-06 14:31:36

如果 User 和 Care 基于相同的基类(例如 Base),那么您可以执行以下操作:

   MyGenericType<T> where T : Base

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

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

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

MyGenericType<T> where T : IMyInterface

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

If User and Care are based on the same base class, say Base, then you can do things like:

   MyGenericType<T> where T : Base

In general, you can specify Base wherever you mean either User or Car. In extension methods or other methods. Same.

However, if User and Car do not share the same base class, then you'll have to implement a common interface to tie them together. For example:

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

MyGenericType<T> where T : IMyInterface

You have to have something to tie the two classes together. Otherwise, you cannot just specify any two classes for the compiler to enforce.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文