A czego spodziewasz się z tego osiągnąć? Powiedz nam, co chcesz osiągnąć, a nie jak spodziewasz się tego osiągnąć.
Jon Skeet
@JonSkeet: Chcę mieć możliwość wywołania funkcji z obiektu. Obecnie obj.MyFunction();nie kompiluje się, chociaż wiem, że rzeczywisty obiekt ma taką funkcję.
Paul Lassiter
@ psubsee2003: nie, nie, ponieważ jest to odwołanie do obiektu przekazywane przez interop.
Paul Lassiter
3
@PaulLassiter: Jeśli nie znasz typu, co deklaruje MyFunctionmetodę?
To naprawdę bezużyteczna odpowiedź, nie zasługująca na pozytywne głosy. Odbicie obiektu typu object nie da „rzeczywistego typu” obiektu, o co prosi OP. Ponadto logika MyMethod jest wadliwa, ponieważ obiekt może być typu A, a także może być typu B. Twoja logika nie dostarcza "rzeczywistego typu" (zgodnie z żądaniem OP) - zapewnia zgodny typ i niekoniecznie pożądany typ.
Jazimov
użyj obj.GetType (). To na pewno zwróci jego rzeczywisty typ.
JSON
3
A co z JsonConvert.DeserializeObject (object.ToString ());
To nie jest satysfakcjonująca odpowiedź. Pytanie OP nie ma nic wspólnego z Jsonem ani serializacją.
@ user12637955 jest to właściwie działająca odpowiedź, ale ma większą złożoność ze względu na boxing i unboxing, tj. obiekt -> ToString () -> do konkretnego typu. Aby być dokładniejszym, powinno to wyglądać tak:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coke
1
W moim przypadku AutoMapper działa dobrze.
AutoMapper może mapować do / z obiektów dynamicznych bez żadnej jawnej konfiguracji:
Ta metoda może nie być najbardziej wydajna, ale jest prosta i spełnia swoje zadanie.
Wykonuje dwie operacje: najpierw wywołuje .ToString (), który jest zasadniczo serializacją, a następnie deserializację przy użyciu nuget Newtonsoft (który należy zainstalować).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Powinieneś krótko opisać swoją odpowiedź przyszłym czytelnikom.
Suraj Kumar
0
Jeśli twoja MyFunction()metoda jest zdefiniowana tylko w jednej klasie (i jej potomkach), spróbuj
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Jeśli masz dużą liczbę w niepowiązanych klasach definiujących funkcję, którą chcesz wywołać, powinieneś zdefiniować interfejs i sprawić, by klasy definiowały ten interfejs:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Przerzuć go na jego rzeczywisty typ, jeśli teraz typ, na przykład jest zorientowany z klasy o nazwie abc. Możesz wywołać swoją funkcję w ten sposób:
(abc)(obj)).MyFunction();
jeśli nie znasz funkcji, możesz to zrobić w inny sposób. Nie zawsze łatwo. Ale możesz to znaleźć w jakiś sposób po jego sygnaturze. Jeśli tak jest w Twoim przypadku, daj nam znać.
To jest nielogiczne. Właściwie nie znasz rzeczywistego typu. Jak masz to zrobić?
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();
nie kompiluje się, chociaż wiem, że rzeczywisty obiekt ma taką funkcję.MyFunction
metodę?Odpowiedzi:
Jeśli znasz rzeczywisty typ, po prostu:
Jeśli nie znasz konkretnego typu, to: nie do końca, nie. Zamiast tego musiałbyś użyć jednego z:
Na przykład:
źródło
as
do rzutowaniatype(of: ClassName)
typów i funkcji sprawdzającej typ instancji.Myślę, że nie możesz (nie bez refleksji), powinieneś także podać typ swojej funkcji:
UPD :
To może Ci pomóc:
źródło
A co z JsonConvert.DeserializeObject (object.ToString ());
źródło
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
W moim przypadku AutoMapper działa dobrze.
AutoMapper może mapować do / z obiektów dynamicznych bez żadnej jawnej konfiguracji:
Podobnie możesz mapować bezpośrednio ze słowników do obiektów, AutoMapper ustawi klucze w linii z nazwami właściwości.
więcej informacji https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
źródło
Ta metoda może nie być najbardziej wydajna, ale jest prosta i spełnia swoje zadanie.
Wykonuje dwie operacje: najpierw wywołuje .ToString (), który jest zasadniczo serializacją, a następnie deserializację przy użyciu nuget Newtonsoft (który należy zainstalować).
źródło
Jeśli twoja
MyFunction()
metoda jest zdefiniowana tylko w jednej klasie (i jej potomkach), spróbujJeśli masz dużą liczbę w niepowiązanych klasach definiujących funkcję, którą chcesz wywołać, powinieneś zdefiniować interfejs i sprawić, by klasy definiowały ten interfejs:
źródło
Przerzuć go na jego rzeczywisty typ, jeśli teraz typ, na przykład jest zorientowany z klasy o nazwie abc. Możesz wywołać swoją funkcję w ten sposób:
jeśli nie znasz funkcji, możesz to zrobić w inny sposób. Nie zawsze łatwo. Ale możesz to znaleźć w jakiś sposób po jego sygnaturze. Jeśli tak jest w Twoim przypadku, daj nam znać.
źródło
Rzutowanie na rzeczywisty typ jest łatwe:
źródło
źródło