强制转换类型不起作用
本文关键字:不起作用 类型 转换 | 更新日期: 2023-09-27 18:33:38
我有以下类:
// abstract
abstract class Module
{
public Options Params;
}
abstract class Options { }
// implementation
class MyModule : Module
{
public new MyOptions Params = new MyOptions();
}
class MyOptions : Options
{
public string Param1;
}
和代码:
var MyMod = new MyModule();
MyMod.Params.Param1 = "new value"; // ok
// convert
Module Mod = MyMod; // if use MyModule Mod - ok
if (Mod.Params as MyOptions != null)
{
MessageBox.Show("cast OK"); // not execute
}
模块可以是不同类型的(我不知道它们),但它总是从模块继承而来的。我需要确定字段Params
是否是实例(或实现)MyOptions
并获取值,如果为真。我会对任何决定感到满意。
您使用 new
关键字隐藏了Options
字段,因此只有在从 MyModule
调用时才能访问它。
Module.Params
和 MyModule.Params
之间没有连接,即使运行时知道 Mod
是一个MyModule
,它仍然从 Module.Params
获取值,即null
。
请参阅了解何时使用覆盖关键字和新关键字
如果你想要真正的继承,你需要使用虚拟方法(或者在本例中,虚拟属性):
abstract class Module
{
public abstract Options Params { get; set; }
}
class MyModule : Module
{
private Options myParams = new MyOptions();
public override Options Params
{
get { return myParams; }
set { myParams = value; }
}
}
var MyMod = new MyModule();
(MyMod.Params as MyOptions).Param1 = "new value";
Module Mod = MyMod;
if (Mod.Params as MyOptions != null)
{
Console.WriteLine("cast OK");
}
您正在寻找is
:
if(Mod.Params is MyOptions)
{
}
阅读有关是运算符的信息。
最好使用 is
因为不需要强制转换和检查 null。在这里试试<</p>
Mod 被认为是模块,所以参数总是选项。你应该先将 Mod 投射回 MyModule
此外,逻辑简洁的版本:
abstract class Module
{
public Options Params { get; protected set; }
}
abstract class Options { }
class MyModule : Module
{
public MyOptions MyParams
{
get
{
if (Params == null) Params = new MyOptions();
return Params as MyOptions;
}
}
}
class MyOptions : Options
{
public string Param1;
}
用:
var MyMod = new MyModule();
MyMod.MyParams.Param1 = "new value";
// convert
Module Mod = MyMod;
var Params = Mod.Params as MyOptions;
if (Params != null)
{
MessageBox.Show(Params.Param1);
}