C#: Objekt aus gettype erzeugen

#2226811
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!
#2229352
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..
Gast #2229878
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren