是否可以在不使用is
运算符的情况下将泛型类强制转换为其专用版本?
我问这个是因为在OnItemDataBound
的许多中继器中,我必须找到当前有is
的类:
protected GenericDataBound(object sender, RepeaterItemEventArgs e)
{
if(e.Item.DataItem is SpecialClass)
((SpecialClass)e.Item.DataItem).DoWhateverIWant();
if (e.Item.DataItem is MoreThanSpecialClass)
((MoreThanSpecialClass)e.Item.DataItem).DoWhateverIWant();
}
我无法执行以下操作,因为它不会编译,因为它不知道编译类型的类型:
protected GenericDataBound(object sender, RepeaterItemEventArgs e)
{
((e.Item.DataItem.GetType()) e.Item.DataItem).DoWhateverIWant()
}
我理解这个例子并不完美 - 并且类的工程设计并不完美,但是对于更广泛的案例来说过于简单化了,我已经看到OP需要调用方法的其他问题,那就是不是这样,在我不想重复的条件下进行评估和其他程序......
答案 0 :(得分:1)
难道你不能通过一个必须是ClasseItemServico
protected void GenericDataBound<T>(object sender, RepeaterItemEventArgs e) where T : ClasseItemServico
{
((T)e.Item.DataItem).DoWhateverIWant();
}
我假设这两个类都继承自ClasseItemServico
,不是吗?
你会以这种方式使用它:
protected void Repeater1_DataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
GenericDataBound<SpecialClass>(sender, e); // here you know the type
}
}
答案 1 :(得分:1)
嗯,问题在于,为了进行强制转换,您需要告诉编译器您要强制转换为什么类型。
最好的解决方案是使用正确的继承并使用虚拟的DoWhateverIWant
方法。
如果您不是从基类继承,则可以使用`dynamic'关键字:
protected GenericDataBound(object sender, RepeaterItemEventArgs e)
{
dynamic dObj = e.Item.DataItem;
dObj.DoWhateverIWant();
}
在这个例子中,基本上你告诉编译器:“相信我,这个方法存在”。