2

我有一个 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 处遇到错误。挑战是过滤器可以是任何派生类类型。有没有办法将过滤器对象类型转换为其实际的派生类?

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

正确的方法应该是什么?

4

2 回答 2

6

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

不,您必须在 compile-time知道您尝试转换为的类型。

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

基本上,目前您的请求不是一个有用的请求 - 但如果您可以提供更多关于您实际尝试做的事情的详细信息,以及为什么您认为“转换为实际类型”是合适的,我们可能会能够为您提供更多帮助。

某些情况下,您可能会发现 usingdynamic会有所帮助 - 但我只会在更清洁的方法失败后将其用作最后的手段 - 在不知道您想要实现什么的情况下,我们无法就这些更清洁的方法向您提供建议.

于 2012-11-23T07:23:13.880 回答
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
   }
}
于 2012-11-23T07:39:51.523 回答