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

C# 要通过将类与其静态成员进行比较来检查类的类型吗,c#,.net,C#,.net,我有一个父类Command,它有一个const名称和一个名为execute的虚拟方法;两者都被子项覆盖。我有一个方法,它接受命令列表并返回可能修改的命令列表 要确定是否应该更改输入命令列表,我需要在更改此列表之前知道列表中每个命令的类型。但问题是,我必须使用new关键字才能为派生类创建与父类同名的静态成员,但我希望能够静态引用命令的名称 我正在尝试做的示例: public List<Command> ReplacementEffect(List<Command> exCh

我有一个父类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()==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
     }

我不太明白为什么不能通过获取派生类的类型来处理这个问题,比如“if(exChain[index].Name是StaticReference)”?旁注:显示
命令的最小部分可以更好地解决这个问题。。。另外,“使用
new
关键字以便…”通常会生成行为奇怪的代码,因此最好扩展查找
item的原因。GetType()==typeof(SomeType)
item是SomeType
非直观的。。。请注意,有更好的方法来处理对象类型的组。您不需要在类型中嵌入类型的名称。您可以执行
obj是类型
,以便于检查。撇开这一点不谈,使用派生类进行类型检查通常是一种反模式,不管您如何操作。静态成员不能被类的实例访问,只能对它们进行静态引用。但是,我希望能够在其他方法中静态引用类的名称。啊,我没有看到“is”关键字,这就是我正在寻找的功能。我需要对派生类进行类型检查的原因是,修改执行链取决于命令的给出顺序。IE:如果我有一个命令,上面写着“给一个苹果”,但是有一个效果是“在给一个苹果之前,你必须拿一个苹果”,那么命令列表必须从{GiveApple}改为{TakeApple,GiveApple},而如果列表上写着{GiveBanana},它就必须保持列表不变。你的解决方案是正确的,但是你对.GetType()的评论==typeof(StaticReference)不工作是不正确的,因为GetType()生成的是实际类型,而不是基类类型。您是正确的。
操作符,这正是我所想的。
     if(exChain[index].CommandName == StaticReference.Name)
     {
         //Modify exChain here
     }