С# доступ к подклассу методом путем литья

Вопрос:

У меня есть следующий абстрактный класс:

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

Однако im получает ошибку, что нет такого поля в объекте ContactQueue

Итак, как мне получить к нему доступ?

Лучший ответ:

Как уже отмечалось, у вас отсутствует скобка, которая вызывает ошибку.

Вместо этого вы можете использовать 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;
        }
    }
}

Это предотвратит исключения во время выполнения для несоответствующих типов.

Ответ №1

Вам нужно добавить круглые скобки:

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

Ответ №2

Вам нужно добавить paranthesis, что происходит:

  1. contactqueue.mail_answer_percentage называется
  2. cast вызывается на contactqueue.mail_answer_percentage для типа GeneralPercentageQueue

Поскольку свойство mail_answer_percentage не является свойством типа ContactQueue первый вызов завершается с ошибкой, и вы получаете сообщение об ошибке, что mail_answer_percentage не является свойством в ContactQueue

поэтому ваш код должен выглядеть так:

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

Оцените статью
TechArks.Ru
Добавить комментарий