Array of scripts: How to access the scripts by name?

I’m currently designing power up-type items. When they are picked up, they disappear and the power up affects the player.
Every item has its own sprite and script.

What I want to do is that when an item spawns, a random sprite + script gets picked and added to the item. But every sprite should be kind of linked to its script, of course.

What I thought of was putting both the sprite names and the scripts in arrays, at the same positions.

string[] spriteNames = new string[2] {"ItemSpeedUpSprite", "ItemFireFasterSprite"};
PowerUp[] itemTypes = new PowerUp[2] {SpeedUp, FireFaster};

void Start () {
	int rand = Random.Range (0, 1);
	GetComponent<SpriteRenderer> ().sprite =
		Resources.Load (spriteNames[rand], typeof(Sprite)) as Sprite;
	gameObject.AddComponent<itemTypes[rand]>();
}

In this case for example, I would get for the random value “1” the sprite “ItemFireFasterSprite” and the script “FireFaster”. “PowerUp” is the inherited super class of all item scripts.

I get however a compiler error for the PowerUp array. Something like
“SpeedUp is a type, but it is being used like a variable.”
I apparently cannot just use the script’s class as an array item, it seems. How can I access the scripts and put them in an array then? Or is there another way to access the scripts, e.g. by getting them by name or something?

Your problem is here → PowerUp itemTypes = new PowerUp[2] {SpeedUp, FireFaster};
SpeedUp and FireFaster are types.

The stuff between the brackets represents the actual content of the array when initialized, not the types.

Example:

SpeedUp speedUp = *.GetComponent<SpeedUp>(); //variable A
FireFaster fireFaster=  *.GetComponent<FireFaster >(); //variable B
PowerUp[] itemTypes = new PowerUp[2] {speedUp , fireFaster};

Where * is the reference to the GameObject that has the corresponding script components.

To access a script you usually do this:

ScriptClass myScript = GameObject.Find("GameObject name").GetComponent();