c# - 返回接口(interface)但具体可能具有不在接口(interface)上的属性,我可以通过强制转换获得它们吗?

标签 c# asp.net interface concreteclass

我感觉我对界面的使用不正确。我知道接口(interface)是具体类必须遵守的契约。

所以我将解释我正在尝试解决的问题,也许有人可以为我指明正确的方向。

我正在构建一个为任何请求返回页面的应用程序,我有三种页面类型,CMS、产品和类别。

这三个都必须实现以下接口(interface):

public interface IPage
    {
        PageType PageType { get; set; }
        PageContent Content { get; set; }
        Meta Meta { get; set; }
    }

无论页面类型如何,都会重新查询这些属性。

一个页面可能有额外的属性,这取决于它们的类型,例如一个类别页面可能是这样的:

public class CategoryPage : IPage
    {
        public PageType PageType { get; set; }
        public PageContent Content { get; set; }
        public Meta Meta { get; set; }

        public List<Product> Products { get; set; }
    }

目前我有一个页面服务,它将为请求的 url 返回一个页面。

根据 PageType 它知道返回什么类型的页面。

问题是 pageService 返回一个 IPage 以便它可以返回任何页面类型。

这是一个问题,因为并非我所有的具体都只实现接口(interface),在类别页面的情况下,它还有一个列表,正如您所期望的那样,除非我转换为具体类型,否则我无法访问它。

但有没有一种方法可以返回通用页面类型并让接收者知道它具体是什么?

我确定目前我的做法不是最好的方法,并且希望就如何解决这个小问题提供一些指导和建议。

谢谢

更新

我已经决定要 Actor 了。

我确信必须有更好的方法来处理这样的情况:多个类使用一些基本属性但也实现了它们自己的属性。当您从服务中获取其中一个类时,您需要知道返回了什么,以便您可以使用相关属性。

或者我在这里尝试做的事情可能完全错误,我需要采取另一种方法。我想我会继续我现在拥有的东西,但要继续思考它。

更新 2

我已经改变了我这样做的方式,所以我不需要强制转换,我有一个 PageType 枚举,我用它来识别正在使用的页面类型。

这与继承所需一切的 Ipage 相结合似乎是一个足够好的解决方案,并且消除了对转换的需要。

最佳答案

您始终可以使用 is keyword 检查您引用的对象是否属于特定类型;

if(obj is Class1) {

也就是说,如果您的设计要求您了解具体类型,那么很可能是设计本身出了问题。如果类之间的行为存在差异,请在类内部实现差异,而不必强制转换它们以在类外部实现。

关于c# - 返回接口(interface)但具体可能具有不在接口(interface)上的属性,我可以通过强制转换获得它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046978/

相关文章:

c# - 使用 C# 在 WMI 中返回 CPU 使用率

c# - WCF 服务的 basicHttpBinding 上的 HTTPS

asp.net - 在 Visual Studio 编辑器中配置 <% %> block 的格式

Java - 接口(interface),实例化一个接口(interface)?

PHP接口(interface)问题-找不到类

c# - 如何在 C# 中删除包含只读文件的目录?

c# - 在呈现之前从 WebBrowser Control 中删除标记

asp.net - 从 RouteBase.GetVirtualPath 返回绝对路径

c# - 在接口(interface)中声明成员函数

c# - 使用哪个 linq 在当前集合中的集合中进行集合搜索