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

本文关键字:访问 类方法 转换 | 更新日期: 2023-09-27 18:21:25

我有以下抽象类:

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

然而,我得到一个错误,在对象ContactQueue 中没有这样的字段

那么我该如何访问它呢?

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

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

相反,您可以使用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;
        }
    }
}

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

您需要添加括号:

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

您需要添加paranthesign。发生的情况如下:

  1. contactqueue.mail_answer_percent被调用
  2. 在contactqueue.mail上调用cast以键入GeneralPercentageQueue

因为属性mail_answer_percentage不是类型ContactQueue中的属性,所以第一次调用失败,并且您得到的错误是mail_answer_percentage不是ContactQueue 中的属性

所以你的代码应该看起来像

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