3

我有以下课程:

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

模块可以是不同的类型(我不知道它们),但它总是从 Module 继承而来。我需要确定该字段是否Params为实例(或实现)MyOptions并获取值,如果为真。我会对任何决定感到高兴。

4

4 回答 4

2

您正在Options使用关键字隐藏该字段new,因此只有从MyModule.

Module.Params和之间没有联系MyModule.Params,即使运行时知道它Mod是 a 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"); 
}
于 2013-10-03T10:04:59.500 回答
1

您正在寻找is

if(Mod.Params is MyOptions)
{
}

阅读is运算符。

它总是更好用is,因为您不需要强制转换和检查 null。在这里试试

于 2013-10-03T10:00:26.213 回答
0

Mod 被视为模块,因此 Params 始终是选项。您应该先将 Mod 转换回 MyModule

于 2013-10-03T10:11:33.330 回答
0

此外,逻辑和简洁的版本:

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);
}
于 2013-10-03T10:38:35.330 回答