Apakah tipe tersebut diketahui pada waktu kompilasi?
psubsee2003
1
Dan apa yang ingin Anda capai dari ini? Tolong beri tahu kami apa yang Anda coba capai, bukan bagaimana Anda berharap untuk mencapainya.
Jon Skeet
@JonSkeet: Saya ingin dapat memanggil fungsi dari objek. Saat obj.MyFunction();ini tidak dapat dikompilasi, meskipun saya tahu bahwa objek sebenarnya memiliki fungsi itu.
Paul Lassiter
@ psubsee2003: tidak, karena ini adalah referensi objek yang dilewatkan melalui interop.
Paul Lassiter
3
@PaulLassiter: Jika Anda tidak tahu tipenya, apa yang mendeklarasikan MyFunctionmetodenya?
Ini benar-benar jawaban yang tidak berguna, tidak layak mendapat suara positif. Refleksi dari sebuah objek bertipe objek tidak akan menghasilkan “tipe sebenarnya” dari objek tersebut, seperti yang diminta oleh OP. Selain itu, logika MyMethod Anda cacat karena obj bisa dari tipe A dan juga bisa dari tipe B. Logika Anda tidak menyediakan "tipe sebenarnya" (seperti yang diminta OP) - ini menyediakan tipe yang kompatibel, dan belum tentu jenis yang diinginkan saat itu.
Jazimov
gunakan obj.GetType (). Itu pasti akan mengembalikan tipe aslinya.
JSON
3
Bagaimana dengan JsonConvert.DeserializeObject (object.ToString ());
Ini bukanlah jawaban yang memuaskan. Pertanyaan OP tidak ada hubungannya dengan Json atau serialisasi.
@ user12637955 ini sebenarnya adalah jawaban yang berfungsi, tetapi memiliki kompleksitas yang lebih besar, karena tinju dan unboxing, yaitu objek -> ToString () -> ke tipe konkret. Untuk lebih akuratnya akan terlihat seperti ini:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coke
1
Dalam kasus saya, AutoMapper berfungsi dengan baik.
AutoMapper dapat memetakan ke / dari objek dinamis tanpa konfigurasi eksplisit apa pun:
Metode ini mungkin bukan yang paling efisien tetapi sederhana dan berhasil.
Ini melakukan dua operasi: pertama memanggil .ToString () yang pada dasarnya adalah serialisasi, dan kemudian deserialisasi menggunakan Newtonsoft nuget (yang harus Anda instal).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Anda harus menjelaskan jawaban Anda secara singkat untuk pembaca yang akan datang.
Suraj Kumar
0
Jika MyFunction()metode Anda hanya ditentukan dalam satu kelas (dan turunannya), coba
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Jika Anda memiliki jumlah besar di kelas yang tidak terkait yang mendefinisikan fungsi yang ingin Anda panggil, Anda harus menentukan antarmuka dan membuat kelas Anda menentukan antarmuka itu:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Transmisikan ke tipe aslinya jika Anda sekarang tipe, misalnya berorientasi dari kelas bernama abc. Anda dapat memanggil fungsi Anda dengan cara ini:
(abc)(obj)).MyFunction();
jika Anda tidak tahu fungsinya, itu bisa dilakukan dengan cara yang berbeda. Tidak selalu mudah. Tetapi Anda dapat menemukannya dengan beberapa cara melalui tanda tangannya. Jika ini kasus Anda, beri tahu kami.
Ini tidak masuk akal. Anda sebenarnya tidak tahu tipe sebenarnya. Bagaimana Anda bisa melakukan itu?
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();
ini tidak dapat dikompilasi, meskipun saya tahu bahwa objek sebenarnya memiliki fungsi itu.MyFunction
metodenya?Jawaban:
Jika Anda tahu tipe sebenarnya, maka:
Jika Anda tidak tahu tipe sebenarnya, maka: tidak juga, tidak. Anda harus menggunakan salah satu dari:
Sebagai contoh:
sumber
as
untuk typecasting dantype(of: ClassName)
fungsi untuk memeriksa jenis instance.Saya rasa Anda tidak bisa (bukan tanpa refleksi), Anda harus memberikan tipe untuk fungsi Anda juga:
UPD :
Ini mungkin berhasil untuk Anda:
sumber
Bagaimana dengan JsonConvert.DeserializeObject (object.ToString ());
sumber
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Dalam kasus saya, AutoMapper berfungsi dengan baik.
AutoMapper dapat memetakan ke / dari objek dinamis tanpa konfigurasi eksplisit apa pun:
Demikian pula Anda dapat memetakan langsung dari kamus ke objek, AutoMapper akan membariskan kunci dengan nama properti.
info lebih lanjut https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
sumber
Metode ini mungkin bukan yang paling efisien tetapi sederhana dan berhasil.
Ini melakukan dua operasi: pertama memanggil .ToString () yang pada dasarnya adalah serialisasi, dan kemudian deserialisasi menggunakan Newtonsoft nuget (yang harus Anda instal).
sumber
Jika
MyFunction()
metode Anda hanya ditentukan dalam satu kelas (dan turunannya), cobaJika Anda memiliki jumlah besar di kelas yang tidak terkait yang mendefinisikan fungsi yang ingin Anda panggil, Anda harus menentukan antarmuka dan membuat kelas Anda menentukan antarmuka itu:
sumber
Transmisikan ke tipe aslinya jika Anda sekarang tipe, misalnya berorientasi dari kelas bernama abc. Anda dapat memanggil fungsi Anda dengan cara ini:
jika Anda tidak tahu fungsinya, itu bisa dilakukan dengan cara yang berbeda. Tidak selalu mudah. Tetapi Anda dapat menemukannya dengan beberapa cara melalui tanda tangannya. Jika ini kasus Anda, beri tahu kami.
sumber
Mentransmisi ke tipe sebenarnya itu mudah:
sumber
sumber