转换类型不起作用

时间:2013-10-03 09:57:50

标签: c# type-conversion

我有以下课程:

// 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 个答案:

答案 0 :(得分:2)

您正在使用Options关键字隐藏new字段,因此只有在MyModule调用时才能访问该字段。

Module.ParamsMyModule.Params之间没有任何关联,即使运行时知道ModMyModule,它仍会从{{1}获取值},这是Module.Params

请参阅Knowing When to Use Override and New Keywords

如果你想要真正的继承,你需要使用虚方法(或者在这种情况下,虚拟属性):

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

答案 1 :(得分:1)

您正在寻找is

if(Mod.Params is MyOptions)
{
}

了解is运营商。

使用is总是更好,因为您不需要强制转换并检查null。试一试here

答案 2 :(得分:0)

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

答案 3 :(得分: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);
}