类型化基类引用其实际类型

时间:2012-11-23 07:21:42

标签: c# casting polymorphism

我有一个Class BaseFilter和一些BaseFilter类的派生类。

1. List<base> list = getFilters();
2. foreach(Base filter in list){
3.     var filterType = filter.GetType();
4.     var filter1 = filter as filterType;
5.     //DO SOME DERIVED CLASS OPERATION
6. }

我在代码行3遇到错误。挑战是filter可以是任何派生类类型。有没有办法将过滤器对象强制转换为它的实际派生类?

我收到以下错误: 找不到类型或命名空间名称'filterType'(您是否缺少using指令或程序集引用?)

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

  

有没有办法将过滤器对象强制转换为实际的派生类?

没有。你必须知道你在编译时试图转换为的类型

如果您不知道该类型,您如何知道要执行哪项操作?如果对所有类型执行相同的操作,那么该操作应该在基类中存在(可能以抽象形式)。

基本上,目前您的请求不是很有用 - 但是如果您可以提供有关您实际尝试做什么的更多详细信息,以及为什么您认为“实际类型“是合适的,我们可以帮助你更多。

某些案例中,您可能会发现使用dynamic会有所帮助 - 但我只会将其作为最后的手段,在更清洁的方法失败后 - 我们不能在不知道你想要实现的目标的情况下,建议你采用那些更清洁的方法。

答案 1 :(得分:2)

正如Jon Skeet所说,你不能在不知道类型的情况下施放进行打字。但是,如果您在编译时知道少量派生类,则可以执行以下操作:

List<base> list = getFilters();
foreach(Base filter in list)
{
   if(filter is DerivedFilter1)
   {
      var derived1 = filter as DerivedFilter1;  
      // do some DerivedFilter1 specific operations
   }
   else if(filter is DerivedFilter2)
   {
      var derived2 = filter as DerivedFilter2;  
      // do some DerivedFilter2 specific operations
   }
   else 
   {
      // do some general operations
   }
}