【问题标题】:In a child class, how to get different types for a specific property?在子类中,如何获取特定属性的不同类型?
【发布时间】:2011-09-12 11:34:06
【问题描述】:

我有以下课程:

class BusinessBase {     }

class BusnessChild: BusinessBase {     }

class VisualBase
{
     BusinessBase BusinessObject {get; set;}
}

class VisualChild: VisualBase
{
    // I'm instantiate an instance of BusinessChild and 
    // assign it to BusinessObject property
}

在每个视觉子实例中,都有一个来自该适当类型的 BusinessChild 实例对象。

我的意思是它们是 BusinessChild1BusinessChild2 对于 VisualChild1VisualChild2 并且它们都继承自 VisualBaseBusinessBase


问题是:

有没有办法从VisualChild 获取BusinessChild 的实例而不在子类中创建新属性?因为我想处理来自父引用的所有子实例。

到目前为止我的想法是创建一个名为GetBusinessObject<T> 的通用方法并将适当的业务类型传递给它,但我想知道它是否可以自动完成以某种方式(不传递类型) .

如果不清楚,请向我询问更多信息。

【问题讨论】:

    标签: c# oop class inheritance


    【解决方案1】:

    一种明显的方法是使VisualBase 通用:

    class VisualBase<T> where T : BusinessBase
    {
        T BusinessObject {get; set;}
    }
    
    class VisualChild1 : VisualBase<BusinessChild1>
    {
        ...
    }
    

    【讨论】:

    • 有时第二快比它需要的要差一个地方:)
    • @Jon Skeet:我很尴尬,因为我没有想到一个 Generic 类,可能是因为我以前没有使用过它。非常感谢
    • @French Boy:不用尴尬——我只是希望它能满足你的需要:)
    • @Jon Skeet:绝对可以。谢谢。它以专业的方式解决了问题。
    • 这个解决方案的一个问题是VisualBase不再是通用的基类,因为泛型特化在oop方面没有关系,所以在不知道具体类的情况下不能调用属性BusinessObject。
    【解决方案2】:

    您可以使用自定义属性装饰派生类:

    [BusinessObjectTypeAttribute(typeof(VisualChild))]
    class VisualChild: VisualBase
    {
        // I'm instantiate an instance of BusinessChild and 
        // assign it to BusinessObject property
    }
    

    然后你用GetCustomAttributes()读出这个属性,用Activator.CreateInstance()创建实例并将类型传递给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2015-09-01
      • 2018-03-19
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多