想要通过将类与其静态成员进行比较来检查类的类型

时间:2013-03-30 01:29:06

标签: c# .net

我有一个父类Command,它有一个const名称和一个名为execute的虚方法;两者都被孩子覆盖。我有一个方法,它接受一个命令列表并返回一个可能修改的命令列表。

要确定是否应更改输入命令列表,我需要在更改此列表之前知道列表中每个命令的类型。但问题是我必须使用new关键字来为派生类创建一个静态成员,其名称与父级相同,但我希望能够静态引用命令的名称。

我正在尝试做的例子:

public List<Command> ReplacementEffect(List<Command> exChain)
{
    for(int index = 0; index < exChain.Count; index++)
    {
         if(exChain[index].Name == StaticReference.Name)
         {
             //Modify exChain here
         }
    }
    return exChain;
}

使用exChain [index] .GetType()的问题是我必须实例化该类型的另一个对象,以检查哪个是浪费,耗时且不直观。另外,我必须从Name中删除const修饰符。

编辑:

class Command
{
    public const string Name = "Null";

    public virtual void Execute()
    {
        //Basic implementation
    }
}

class StaticReference : Command
{
    public new const string Name = "StaticRef";

    public override void Execute()
    {
        //New implementation
    }
}

1 个答案:

答案 0 :(得分:0)

如果您确实无法使用类型比较exChain[index].GetType() == typeof(StaticReference),因为派生类都属于StaticReference类型,但您希望通过Name区分(未在您的示例中显示)但如果不是这种情况,请改用类型比较),您可以使用静态属性作为名称,但可以通过虚拟访问器访问它:

class Command
{
    public const string Name = "Null";

    public virtual string CommandName
    {
        get
        {
            return Name;
        }
    }
}

class StaticReference : Command
{
    public new const string Name = "StaticRef";

    public virtual string CommandName
    {
        get
        {
            return Name;
        }
    }
}

用法:

     if(exChain[index].CommandName == StaticReference.Name)
     {
         //Modify exChain here
     }