转换为运行时类型
本文关键字:类型 运行时 转换 | 更新日期: 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();
}
}