【问题标题】:Typecasting base class reference to its actual type将基类引用类型转换为其实际类型
【发布时间】:2014-06-18 05:03:22
【问题描述】:

我有一个 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 指令或程序集引用?)

正确的做法应该是什么?

【问题讨论】:

标签: c# casting polymorphism


【解决方案1】:

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

没有。您必须知道要在编译时转换为的类型

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

基本上,目前您的请求不是一个有用的请求 - 但如果您能提供更多详细信息,说明您实际上想要做什么,以及为什么您认为“实际类型”是合适的,我们也许可以为您提供更多帮助。

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

【讨论】:

  • 忽略此评论的先前版本,我现在明白了在编译时已知类型的转换。
【解决方案2】:

正如 Jon Skeet 已经说过的,你不能在不知道类型的情况下 cast 输入。但是,如果您在编译时知道少量派生类,则可以执行以下操作:

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
   }
}

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多