C#通过强制转换访问子类方法

C#通过强制转换访问子类方法,c#,inheritance,casting,polymorphism,C#,Inheritance,Casting,Polymorphism,我有以下抽象类: abstract class ContactQueue { public abstract DateTime period { get; set; } public abstract String type { get; set; } public abstract String toString(); } 现在,该类的一个子类如下所示: class GeneralPercentageQueue : ContactQueue {

我有以下抽象类:

abstract class ContactQueue
{

    public abstract DateTime period { 
        get; set; }
    public abstract String type { get; set; }
    public abstract String toString();
}
现在,该类的一个子类如下所示:

class GeneralPercentageQueue : ContactQueue
{
    public GeneralPercentageQueue(DateTime period)
    {
        this.period = period;
    }
    public int phone_answer_total {get; set;}
    public int phone_answer_percentage_8025 { get; set; }
    public int web_answer_percentage_8030 { get; set; }
    public int web_answer_percentage_total { get; set; }
    public int mail_answer_percentage { get; set; }
    public override DateTime period { get; set; }
    public override string type { get; set; }
    public override string toString()
    {
        return period.ToString();
    }
}
foreach(ContactQueue cq in p.GetGeneralEmailPercentageData(start,end))
{
    foreach (ContactQueue contactqueue in finalDataList)
    {
        if (cq.period == contactqueue.period)
        {
           (GeneralPercentageQueue)contactqueue.mail_answer_percentage = (GeneralPercentageQueue)cq.mail_answer_percentage;
        }
    }
}
现在,由于我有几个抽象类的子类,我创建了一个列表,可以包含所有这些类,我希望通过该列表循环并访问其中一个specefic字段来实现这一点,我尝试了以下操作:

class GeneralPercentageQueue : ContactQueue
{
    public GeneralPercentageQueue(DateTime period)
    {
        this.period = period;
    }
    public int phone_answer_total {get; set;}
    public int phone_answer_percentage_8025 { get; set; }
    public int web_answer_percentage_8030 { get; set; }
    public int web_answer_percentage_total { get; set; }
    public int mail_answer_percentage { get; set; }
    public override DateTime period { get; set; }
    public override string type { get; set; }
    public override string toString()
    {
        return period.ToString();
    }
}
foreach(ContactQueue cq in p.GetGeneralEmailPercentageData(start,end))
{
    foreach (ContactQueue contactqueue in finalDataList)
    {
        if (cq.period == contactqueue.period)
        {
           (GeneralPercentageQueue)contactqueue.mail_answer_percentage = (GeneralPercentageQueue)cq.mail_answer_percentage;
        }
    }
}
然而,我得到一个错误,在对象
ContactQueue


那么如何访问它呢?

您需要添加括号:

((GeneralPercentageQueue)contactqueue).mail_answer_percentage = ...;

您需要添加以下内容:

class GeneralPercentageQueue : ContactQueue
{
    public GeneralPercentageQueue(DateTime period)
    {
        this.period = period;
    }
    public int phone_answer_total {get; set;}
    public int phone_answer_percentage_8025 { get; set; }
    public int web_answer_percentage_8030 { get; set; }
    public int web_answer_percentage_total { get; set; }
    public int mail_answer_percentage { get; set; }
    public override DateTime period { get; set; }
    public override string type { get; set; }
    public override string toString()
    {
        return period.ToString();
    }
}
foreach(ContactQueue cq in p.GetGeneralEmailPercentageData(start,end))
{
    foreach (ContactQueue contactqueue in finalDataList)
    {
        if (cq.period == contactqueue.period)
        {
           (GeneralPercentageQueue)contactqueue.mail_answer_percentage = (GeneralPercentageQueue)cq.mail_answer_percentage;
        }
    }
}
  • 调用contactqueue.mail\u answer\u百分比
  • 调用contactqueue.mail\u answer\u百分比以键入GeneralPercentageQueue
  • 因为属性
    mail\u answer\u percentage
    不是类型
    ContactQueue
    中的属性,所以第一次呼叫失败,并且您会得到错误,即
    mail\u answer\u percentage
    不是
    ContactQueue

    所以你的代码应该是

    ((GeneralPercentageQueue)contactqueue).mail_answer_percentage =
        ((GeneralPercentageQueue)cq).mail_answer_percentage;
    

    正如其他人提到的,您缺少导致错误的括号

    相反,您可以使用将集合筛选为仅要比较的类型

    foreach(GeneralPercentageQueue cq in p.GetGeneralEmailPercentageData(start,end)
                                          .OfType<GeneralPercentageQueue>())
    {
        foreach (GeneralPercentageQueue contactqueue in finalDataList.OfType<GeneralPercentageQueue>())
        {
            if (cq.period == contactqueue.period)
            {
                contactqueue.mail_answer_percentage = cq.mail_answer_percentage;
            }
        }
    }
    
    foreach(p.GetGeneralEmailPercentageData(开始、结束)中的GeneralPercentageQueue cq)
    .OfType())
    {
    foreach(FinalCatalList.OfType()中的GeneralPercentageQueue contactqueue)
    {
    if(cq.period==contactqueue.period)
    {
    contactqueue.mail\u answer\u percentage=cq.mail\u answer\u percentage;
    }
    }
    }
    

    这将防止运行时出现不匹配类型的异常。

    GetGeneralEmailPercentageData()的返回类型是什么?错误发生在哪里?在“if”或“if”@ncourc84内的指令上,它不能在if处发生,因为基类具有该属性,但在问题+1中错误发生的位置并不清楚,这是一个很好的解决方案,因为它将枚举的类型限制为在运行时不会导致异常的类型