Wie unbox ein C# - Objekt zum dynamischen Typ
Ich versuche, so etwas zu tun:
void someMethod(TypeA object) { ... }
void someMethod(TypeB object) { ... }
object getObject()
{
if (...) return new TypeA();
else return new TypeB();
}
object obj = getObject();
(obj.GetType()) obj; //won't compile
someMethod(obj);
Offensichtlich bin ich verwirrt hier. Ich weiß, ich könnte diese Arbeit machen, indem Sie einfach das schreiben aus einer bedingten Anweisung --
if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj;
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj;
-- aber gibt es nicht ein Weg, dies zu tun bei der Laufzeit?
BEARBEITEN
Ich bin damit einverstanden, es scheint, wie Sie vielleicht nicht die beste design-Auswahl, hier ist also der Zusammenhang. Der Punkt der oben genannten code-Repository Basis-Klasse für Mongo DB. Ich will, dass es in der Lage sein, um die Handhabung der verschiedenen Arten von Tabellen. So, someMethod() ist eigentlich entfernen; und Typ a und TypeB sind ObjectID und Guid; der code unten, ist Teil der Typ-Agnostiker entfernen - Methode, nimmt die ID als Zeichenfolge; und getObject() ist eine Methode zum Parsen der ID-parameter.
- Sie verbindet eine Art
T
mit dem runtime-Typ-Informationen zugeordnet:typeof(T)
. Sie sind nicht die gleiche Sache und nicht als Ersatz für jede andere. - Es gibt wahrscheinlich bessere design-Entscheidungen, aber Sie ließ das eigentliche Ziel, den code aus deinem post. Vielleicht könnten wir Ihnen eine bessere und völlig andere Art des Schreibens, die Lösung für Ihr problem, wenn Sie lassen Sie uns wissen, was Sie versuchen zu erreichen, mit diesem code.
- Woll, ich kenne den Unterschied, ich wollte nur verdeutlichen, was ich versuche zu tun.
- Fisher, fügte der Kontext. Ich nehme an, das wäre vielleicht eine Frage für die "Code Review" zum Austausch, aber wenn Sie Ideen haben, würde ich glücklich sein, um es zu öffnen, als eine separate Frage.
- Haben Sie einen Blick auf Massiven. Finden Sie eine Menge guter Ideen gibt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie .NET 4 und C# 4, können Sie
dynamic
für diese:Andernfalls müssen Sie die Reflexion zu finden, und ruft die richtige Methode. Überlast Auflösung (für nicht-
dynamic
Arten) erfolgt auf kompilieren-Zeit.(Beachten Sie, dass, sofern
TypeA
undTypeB
sind Strukturen, würden Sie nicht unboxing sowieso...)obj.SomeMethod()
?dynamic
Objekt.dynamic
-, die effektiv ziemlich viel alles wird verzögert, bis die Ausführung Zeit, die mit dem tatsächlichen Typ des Objekts.dynamic
ist die Erweiterung Methoden; diese sind nur bei der Kompilierung.