如何通过.GetType()获取类常量

时间:2013-03-25 14:00:18

标签: c# oop

我会尽力解释。 我有3个班:EnemyTeleport,EnemyZigZag,EnemyNormal。他们都继承了基类敌人。 这3个类中的每一个都有自己的const - > KillPoints。

所以在其他课堂上。例如Form Class,我需要获得这些常量。 这些EnemyTeleport,EnemyZigZag,EnemyNormal位于public Enemy EnemyInstance; 例如

EnemyInstance = new EnemyTeleport();

那我如何从EnemInstance获得杀戮积分呢?我不想检查每个可能的变体?

有更聪明的方法吗?

EnemInstance.GetType().KillPoints(没有工作)

再次。 EnemyInstance是Enemy类型,拥有EnemyTeleport。常数保留在EnemyTeleport

3 个答案:

答案 0 :(得分:2)

为什么不使用KillPoints的属性扩展基类Enemy。在继承类的构造函数中,您可以将KillPoints设置为特定敌人的特定值

但是如果你不想把它放到基类中:

将KillPoints作为某个敌人的属性,如:

public class TeleportEnemy : Enemy
{
   public int KillPoints{get;private set;}
   public TeleportEnemy()
   {
      this.KillPoints = 666;
   }
}

Enemy实例访问Killpoints的代码如下:

Enemy enemy = new TeleportEnemy();
        PropertyInfo propertyInfo = enemy.GetType().GetProperty("KillPoints");
        int value = (int)propertyInfo.GetValue(enemy, null);

答案 1 :(得分:1)

我建议您使用

public abstract class Enemy
{
   public abstract List<int> KillPoints;
}

对于每个特定的类,定义KillPoints的值(您可以使用TemplateMethod模式来计算您的KillPoints)

link:http://www.dofactory.com/Patterns/PatternTemplate.aspx

但是在你的Main中你使用基类Enemy作为你的服务

所以:

Enemy enemy = new EnemyTeleport();
var result = enemy.KillPoints;

答案 2 :(得分:0)

您的层次结构可以定义如下。注意Enemy类是抽象的,而具体的敌人实现属性KillPoints。您的主要实现只需知道抽象类Enemy,而具体实现应该在其他地方创建,具体取决于游戏中的某些标志。

public abstract class Enemy
{
    public abstract int KillPoints {get;}
}

public class EnemyTeleport : Enemy
{
    public override int KillPoints
    {
        get{return 6;}
    }
}

public class EnemyZigZag : Enemy
{
    public override int KillPoints
    {
        get{return 10;}
    }
}

现在您可以利用对KillPoints

的多态调用
private Enemy EnemyInstance;

void Main()
{
    EnemyInstance = new EnemyTeleport();

    Console.WriteLine(EnemyInstance.KillPoints);
}