获取子类的子类型作为类型参数传递给另一个方法

时间:2013-11-01 10:33:43

标签: c# types unity3d

我有一个名为Powerup的基类和2个后代类BombRepel

我有一个需要调用的方法,我将对象类型作为参数传递。

public void PowerupExpired<T>() where T : Powerup {
    //do stuff here
}

基类Powerup有什么办法我可以获取子类类型并将其传递给方法吗?我不能使用通用类型。传递给方法的类型必须是Powerup

类型

现在,我正在Powerup课程中使用:

if (this is BombPowerup)
   PowerupManager.PowerupExpired<BombPowerup>();
else if (this is RepelPowerup)
   PowerupManager.PowerupExpired<RepelPowerup>();
//etc etc

虽然这不是整洁或可扩展的。

编辑:

我忘了添加。我不能拥有通用类型的原因是因为我将使用GetComponent<T>()中的参数类型传递来使用Unity PowerupExpired方法,该方法不接受泛型类型。

3 个答案:

答案 0 :(得分:1)

你的意思是如下吗?我真的不明白你想要什么,但我试了一下。

使Powerup成为一个抽象类,只是所有其他通电的基类。

public abstract class Powerup
{
    // common behaviour for all powerups       
}

然后每种类型的powerup都将从这个基类继承。

public class BombPowerup : Powerup
{
    // specific behaviour
}

声明PowerupExpired方法,使其获取参数。

public void PowerupExpired<T>(T param) where T : Powerup
{
    // for example print a type of an argument
    Console.WriteLine(param.GetType().Name);
}

试试。

PowerupExpired(new BombPowerup());

答案 1 :(得分:1)

从您的代码中,它看起来非常像您希望在PowerupExpired中执行不同的操作,具体取决于它是炸弹还是击退。那么为什么不用两种方法呢?

答案 2 :(得分:1)

如果使用泛型方法的唯一原因是使用泛型统一方法,请不要使用泛型统一方法。

有一种替代方法GetComponent(Type t),您可以在其中传入类型(它实际上更健壮,例如,您可以传入接口而不是从组件继承的类)。

你的代码看起来像(像):

public void PowerupExpired(PowerUp p)
{
    PowerUp powerUpComponent = GetComponent(p.GetType());
}

,其中

class BombPowerup : Powerup
{}

class RepelPowerup : Powerup
{}

并且可能是

class Powerup : Component
{}