Und was erwarten Sie davon? Bitte sagen Sie uns, was Sie erreichen möchten und nicht, wie Sie es erwarten.
Jon Skeet
@ JonSkeet: Ich möchte eine Funktion vom Objekt aus aufrufen können. Derzeit obj.MyFunction();wird nicht kompiliert, obwohl ich weiß, dass das reale Objekt diese Funktion hat.
Paul Lassiter
@ psubsee2003: nein, das ist nicht der Fall, da es sich um eine Objektreferenz handelt, die über Interop übergeben wird.
Paul Lassiter
3
@PaulLassiter: Wenn Sie den Typ nicht kennen, was deklariert die MyFunctionMethode?
Jon Skeet
Antworten:
195
Wenn Sie den tatsächlichen Typ kennen, dann einfach:
Dies ist wirklich eine nutzlose Antwort, die keine Gegenstimmen verdient. Die Reflexion eines Objekts vom Typ Objekt ergibt nicht den "tatsächlichen Typ" des Objekts, wie von OP gefordert. Außerdem ist Ihre MyMethod-Logik fehlerhaft, da obj vom Typ A und vom Typ B sein kann. Ihre Logik liefert nicht den "tatsächlichen Typ" (wie vom OP angefordert) - sie bietet einen kompatiblen Typ und nicht unbedingt der gewünschte Typ dazu.
Jazimov
benutze obj.GetType (). Das wird definitiv den tatsächlichen Typ zurückgeben.
JSON
3
Wie wäre es mit JsonConvert.DeserializeObject (object.ToString ());
Dies ist keine zufriedenstellende Antwort. Die Frage von OP hat nichts mit Json oder Serialisierung zu tun.
@ user12637955 Dies ist eigentlich eine funktionierende Antwort, hat aber aufgrund des Ein- und Auspackens eine größere Komplexität, dh Objekt -> ToString () -> zum konkreten Typ. Um genauer zu sein, sollte es so aussehen:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Cola
1
In meinem Fall funktioniert AutoMapper gut.
AutoMapper kann dynamischen Objekten ohne explizite Konfiguration zugeordnet werden:
Wenn Ihre MyFunction()Methode nur in einer Klasse (und ihren Nachkommen) definiert ist, versuchen Sie es
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Wenn Sie eine große Anzahl in nicht verwandten Klassen haben, die die Funktion definieren, die Sie aufrufen möchten, sollten Sie eine Schnittstelle definieren und Ihre Klassen diese Schnittstelle definieren lassen:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Wandeln Sie es in seinen realen Typ um, wenn Sie jetzt den Typ verwenden, der sich beispielsweise an der Klasse abc orientiert. Sie können Ihre Funktion folgendermaßen aufrufen:
(abc)(obj)).MyFunction();
Wenn Sie die Funktion nicht kennen, können Sie sie auf andere Weise ausführen. Nicht immer einfach. Aber Sie können es irgendwie durch seine Unterschrift finden. Wenn dies Ihr Fall ist, sollten Sie uns dies mitteilen.
Diese Methode ist möglicherweise nicht die effizienteste, aber einfach und erledigt die Aufgabe.
Es führt zwei Operationen aus: Erstens ruft es .ToString () auf, das im Grunde eine Serialisierung ist, und dann die Deserialisierung mit Newtonsoft Nuget (das Sie installieren müssen ).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Das ist unlogisch. Sie kennen den tatsächlichen Typ eigentlich nicht. Wie soll man das machen?
Allen Linatoc
-2
Implement an interface to call your function in your method
interfaceIMyInterface{voidMyinterfaceMethod();}IMyInterfaceMyObj= obj asIMyInterface;if(MyObj!=null){MyMethod(IMyInterfaceMyObj);}
obj.MyFunction();
wird nicht kompiliert, obwohl ich weiß, dass das reale Objekt diese Funktion hat.MyFunction
Methode?Antworten:
Wenn Sie den tatsächlichen Typ kennen, dann einfach:
Wenn Sie den tatsächlichen Typ nicht kennen, dann: nicht wirklich, nein. Sie müssten stattdessen eines der folgenden Elemente verwenden:
Beispielsweise:
quelle
as
für Typumwandlung undtype(of: ClassName)
Funktion zum Überprüfen des Instanztyps.Ich denke nicht, dass Sie dies können (nicht ohne Reflexion), Sie sollten auch einen Typ für Ihre Funktion angeben:
UPD :
Dies kann für Sie funktionieren:
quelle
Wie wäre es mit JsonConvert.DeserializeObject (object.ToString ());
quelle
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
In meinem Fall funktioniert AutoMapper gut.
AutoMapper kann dynamischen Objekten ohne explizite Konfiguration zugeordnet werden:
Ebenso können Sie Objekte direkt von Wörterbüchern zuordnen. AutoMapper richtet die Schlüssel mit Eigenschaftsnamen aus.
Weitere Informationen https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
quelle
Wenn Ihre
MyFunction()
Methode nur in einer Klasse (und ihren Nachkommen) definiert ist, versuchen Sie esWenn Sie eine große Anzahl in nicht verwandten Klassen haben, die die Funktion definieren, die Sie aufrufen möchten, sollten Sie eine Schnittstelle definieren und Ihre Klassen diese Schnittstelle definieren lassen:
quelle
Wandeln Sie es in seinen realen Typ um, wenn Sie jetzt den Typ verwenden, der sich beispielsweise an der Klasse abc orientiert. Sie können Ihre Funktion folgendermaßen aufrufen:
Wenn Sie die Funktion nicht kennen, können Sie sie auf andere Weise ausführen. Nicht immer einfach. Aber Sie können es irgendwie durch seine Unterschrift finden. Wenn dies Ihr Fall ist, sollten Sie uns dies mitteilen.
quelle
Diese Methode ist möglicherweise nicht die effizienteste, aber einfach und erledigt die Aufgabe.
Es führt zwei Operationen aus: Erstens ruft es .ToString () auf, das im Grunde eine Serialisierung ist, und dann die Deserialisierung mit Newtonsoft Nuget (das Sie installieren müssen ).
quelle
Das Casting auf den tatsächlichen Typ ist einfach:
quelle
quelle