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

时间:2013-07-05 15:46:39

标签: 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
{
    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();
    }
}

现在,由于我有几个抽象类的子类,我创建了一个可以包含它们的列表,我想循环遍历该列表并访问其中一个specefic字段来执行此操作,我尝试了以下内容:

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

中没有这样的字段

那我该如何访问呢?

3 个答案:

答案 0 :(得分:3)

您需要添加括号:

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

答案 1 :(得分:3)

正如其他人提到的那样,你错过了导致错误的括号。

相反,您可以使用OfType(T)将集合过滤为仅要比较的类型。

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;
        }
    }
}

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

答案 2 :(得分:1)

您需要添加paranthesis正在发生的事情如下:

  1. 调用contactqueue.mail_answer_percentage
  2. 在contactqueue.mail_answer_percentage上调用强制转换,以键入GeneralPercentageQueue
  3. 由于属性mail_answer_percentage不是ContactQueue类型的属性,因此第一次调用失败,并且您收到mail_answer_percentage不属于ContactQueue <的属性的错误/ p>

    所以你的代码应该是

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