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;
}
}
}
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中错误发生的位置并不清楚,这是一个很好的解决方案,因为它将枚举的类型限制为在运行时不会导致异常的类型