在没有条件的情况下在运行时将给定对象转换为其类?

时间:2014-01-15 12:12:44

标签: c# .net

是否可以在不使用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需要调用方法的其他问题,那就是不是这样,在我不想重复的条件下进行评估和其他程序......

2 个答案:

答案 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();
}

在这个例子中,基本上你告诉编译器:“相信我,这个方法存在”。