1

我有一个名为的基类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

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

编辑:

我忘了补充。我不能拥有泛型类型的原因是因为我将继续使用 UnityGetComponent<T>()方法,使用参数类型 pass through in PowerupExpired,它不接受泛型类型。

4

3 回答 3

1

你的意思是像下面这样吗?我真的不明白你到底想要什么,但我试了一下。

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

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

然后每一种上电都将继承自这个基类。

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());
于 2013-11-01T10:41:13.790 回答
1

从您的代码来看,您非常想PowerupExpired根据它是炸弹还是击退来做不同的事情。那么为什么没有两种方法呢?

于 2013-11-01T10:42:37.783 回答
1

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

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

您的代码看起来(类似于):

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

在哪里

class BombPowerup : Powerup
{}

class RepelPowerup : Powerup
{}

并且大概

class Powerup : Component
{}
于 2013-11-01T15:20:53.463 回答