C#: Objekt zurückgeben?
Hallo,
ich habe folgendes Konstrukt:
public Object Open(Object value)
{
var typ = value.GetType();
if (value != null)
{
if (typ == typeof(ClassOne))
{
foreach (ClassOne item in Liste)
{
value = item;
}
return value as ClassOne;
}
else
{
foreach (ClassTwo item in Liste2)
{
value = item;
}
return value as ClassTwo;
}
}
return value;
}
Wenn ich jetzt Folgendes aufrufe:
ClassOne a = Example.Open(ClassOne);
bekomme ich einen Fehler, da das Objekt erst zur Laufzeit bekannt ist.
Wie kann ich erreichen, dass ich das richtige Objekt bekomme?
3 Antworten
1) Diese Abfrage kommt ein bisschen spät, findest du nicht? 😉
var typ = value.GetType();
if (value != null)
{
// ...
2) So wie ich das sehe, ist ClassOne doch ein Typ / eine Klasse, und kein Objekt?
Ein Aufruf könnte so aussehen:
Object someObject = // create some object ...
ClassOne a = Example.Open(someObject);
Wobei nicht gesichert wäre, dass du stets ein richtiges Objekt zurückbekommst, so wie du es erwartest.
Die Fehlerursache verwundert mich, da in C# Klassen keine "Bürger erster Klasse" (nennt man tatsächlich so) sind, in
ClassOne a = Example.Open(ClassOne);
aber eine Klasse wie ein Objekt verwendet wird.
Möglicherweise funktioniert es, wenn du zuerst ein Dummy-Objekt der Klasse ClassOne erzeugst und auf dieses zugreifst:
ClassOne a = new ClassOne();
a = Example.Open(a);
aber das ist ziemlich unelegant. Eleganter ist es, die Methode Open umzuschreiben oder zu "überladen", sodass sie einen Typ als Argument nimmt:
public Object Open(Type type) {
...
}
-----
Übrigens solltest du unbedingt vorher noch die Abfrage, ob value != null ist, nach oben verschieben, bevor value.GetType() aufgerufen wird. Auch, wenn du den Code danach nie wieder verwendest. Man kann sich nicht zu früh angewöhnen, rechtzeitig auf == null oder != null zu prüfen.
Bin zwar kein C# Profi, aber
ClassOne a = Example.Open(ClassOne);
Du versuchst ein Objekt anzugeben, das anscheinend null ist bzw. nicht richtig deklariert ist und deshalb nicht bekannt ist???
Example.Open(ClassOne);
PS.: Eigentlich ließe sich dein Code auf Folgendes reduzieren: