Forum: PC-Programmierung C#: Objekt aus gettype erzeugen


von André W. (reezer24)


Lesenswert?

Hallo liebe Gemeinde,
es geht um folgendes: aus einer Assembly (Pfad assemblyFile), die eine 
Klasse (z.B. Klasse "Gebäude") sowie dazu Unterklassen enthält (z.B. 
Haus, Kirche, Fabrik) möchte ich die verschiedenen Unter-Klassentypen 
auslesen; diese sollen in einer ComboBox1 dargestellt werden, und - 
sobald der Benutzer einen Typ auswählt - ein neues Objekt 'gebäude'des 
ausgewählten Typs erstellen.Dazu hab ich mir u.a folgenden Code 
geschrieben:
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using Gebäude_Assembly;
10
using System.Reflection;
11
...
12
13
Type[] types;
14
...
15
16
Assembly a = Assembly.LoadFrom(assemblyFile);
17
this.types = a.GetTypes();
18
...
19
20
foreach (Type Typ in types)
21
{                
22
    ComboBox1.Items.Add(Typ);
23
}
24
...
25
26
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
27
{
28
    Type typ = (Type)ComboBox1.SelectedItem;
29
    typ gebäude = Activator.CreateInstance(typ);
30
31
//In der letzten Zeile beim ersten Wort "typ" wird eine Fehlermeldung erzeugt:
32
//"Der Typ- oder Namespacename "typ" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)"            
33
}

Das Auslesen und Darstellen in der ComboBox funktioniert alles 
wunderbar, nur in der letzten Code gibt's diesen Fehler...
Hat jemand von euch eine Idee wo der Fehler liegt oder wie man aus einem 
Type anders ein Objekt erzeugen kann?

Viele Grüße!

von casud (Gast)


Lesenswert?

CreateInstance liefert ein "object" zurück!
Du kannst keine Variable als Typen benutzen.

von Markus V. (Gast)


Lesenswert?

Hi André,

Du könntest folgendes schreiben:
1
Gebäude gebäude = Activator.CreateInstance(typ) as Gebäude;

Gruß
Markus

von André W. (reezer24)


Lesenswert?

Hallo ihr,
besten Dank euch jedenfalls schonmal für die Tipps!
1
Gebäude gebäude = Activator.CreateInstance(typ) as Gebäude;
hat der Compiler geschluckt;
Leider scheint er allerdings noch kein Objekt der Klasse Gebäude erzeugt 
zu haben:

Versucht man eine Zeile weiter auf das neue Objekt zuzugreifen...
1
gebäude.set_name ("Musterhaus1")

...wird eine NullReferenceException ausgegeben ("Der Objektverweis wurde 
nicht auf eine Objektinstanz festgelegt.")

Werd mal noch etwas weiter forschen..

von Jasch (Gast)


Lesenswert?

André W. schrieb:
> Hallo ihr,
> besten Dank euch jedenfalls schonmal für die Tipps!
>
1
Gebäude gebäude = Activator.CreateInstance(typ) as Gebäude;
> hat der Compiler geschluckt;

Hehehe...

Du benutzt hier Reflection und Konsorten, da schluckt der Compiler 
einiges was dramatisch kaputt sein kann, sehr übles Zeug. ;-)

> Leider scheint er allerdings noch kein Objekt der Klasse Gebäude erzeugt
> zu haben:
>
> Versucht man eine Zeile weiter auf das neue Objekt zuzugreifen...
>
>
1
gebäude.set_name ("Musterhaus1")
>
> ...wird eine NullReferenceException ausgegeben ("Der Objektverweis wurde
> nicht auf eine Objektinstanz festgelegt.")

So ist der Operator "as" eben definiert, wenn sein linker Operand vom 
rechts angegebenen (Laufzeit-)Typ ist gibt er den entsprechend gecastet 
zurück, sonst Null.

D.h. "Activator.CreateInstance(typ)" hat eine Instanz vom falschen Typ 
erzeugt oder selber Null zurückgegeben.

Vielleicht hilft's beim Suchen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.