转换为运行时类型

本文关键字:类型 运行时 转换 | 更新日期: 2023-09-27 18:10:02

结构如下:

Abstract Class - Action
--Abstract Class - ConfigsAction
---- ResetAction
---- SetToZeroAction
--Abstract Class - SettingsAction
---- EditLanguageAction
---- ChangeColorPrefAction

ManagerAccessPoint。收到(Action行动)

ManagerAccesPoint接收动作并将其"发送"到适当的concretemmanager。所以ManagerAccessPoint需要将它强制转换为ConfigsAction或SettingsAction然后ConfigManager/SettingsManager将其转换为适当的动作类,它将是ResetAction, SetToZeroAction, EditLanguageAction或ChangeColorPrefAction。

我知道我可以用

保存动作类型
Object.getType().name 

作为字符串。我知道我可以用

从字符串中获得类型
Type­.GetType(string)

但是如何将其转换回该类型呢?它可以像这样可视化:

Retrievetype derievedAction =  (RetrieveType)myAction

其中retrieveType是Type变量

我发现了其他"类似"的问题,但没有一个能给我一个可行的解决方案。

我实际上需要能够调用Child的类特定函数,一旦我在正确的级别收到动作,以便每个子类的行为是不同的。

转换为运行时类型

你的问题没有意义。只有当您要转换的类型在编译时静态已知时,强制转换才有用,否则您将如何使用它?

简而言之,你不能。你可以使用'dynamic'对象,这将允许你编写代码,就好像它已经被强制转换,但我认为这在这里是不合适的。

相反,您可以尝试这样做:

class ManagerAccessPoint
{
    private ConfigManager _configManager;
    private SettingsManager _settingsManager;
    void Receive(Action action)
    {
        var configs = action as ConfigsAction;
        if (configs != null)
        {
            _configManager.Receive(configs);    
            return;
        }
        var settings = action as SettingsAction;
        if (settings != null)
        {
            _settingsManager.Receive(settings);    
            return;
        }
    }
}
class ConfigManager
{
    void Receive(ConfigsAction action)
    {
      // repeat the same pattern here
      var setToZero = action as SetToZeroAction;
      if (setToZero != null)
      {
          // we have a setToZero action!
      }
      etc...
    }
}

类结构看起来很好,管理器的概念也很好。但是如果你需要调用子类的特定功能,那么我们就失去了抽象的概念。尝试通过虚拟/抽象契约方法来处理这些问题。

例如

:

    class ManagerAccessPoint
    {
         public void Receive (Action action)
         {
             //where CallContractMethod is an abstract/virtual method
             //which serves as a contract and now via run time polymorphism
             //the appropriate action method will be called.
             //Each and every child class will have different behavior of this action.
             action.CallContractMethod();
         }
    }