强制转换类型不起作用

本文关键字:不起作用 类型 转换 | 更新日期: 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.ParamsMyModule.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>

div class="answers">

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