Saya memiliki kueri yang mengembalikan tipe anonim dan kueri dalam metode. Bagaimana Anda menulis ini:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
frenchie
sumber
sumber
Jawaban:
Tidak boleh.
Anda hanya dapat kembali
object
, atau wadah benda, misalnyaIEnumerable<object>
,IList<object>
, dllsumber
dynamic
. Itu membuatnya sedikit lebih mudah untuk dikerjakan.Anda dapat mengembalikan
dynamic
yang akan memberi Anda versi runtime dari tipe anonim tetapi hanya di .NET 4+sumber
Di C # 7 kita dapat menggunakan tupel untuk mencapai ini:
Anda mungkin perlu menginstal
System.ValueTuple
paket nuget.sumber
Anda tidak dapat mengembalikan tipe anonim. Bisakah Anda membuat model yang bisa dikembalikan? Jika tidak, Anda harus menggunakan file
object
.Berikut adalah artikel yang ditulis oleh Jon Skeet tentang masalah ini
Kode dari artikel:
Atau, ini artikel serupa lainnya
Atau, saat orang lain berkomentar, Anda dapat menggunakan
dynamic
sumber
Anda dapat menggunakan kelas Tuple sebagai pengganti tipe anonim saat pengembalian diperlukan:
Catatan: Tuple dapat memiliki hingga 8 parameter.
Atau, untuk contoh dari postingan aslinya:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
sumber
Kompilator C # adalah kompilator dua fase. Pada tahap pertama ini hanya memeriksa ruang nama, hierarki kelas, tanda tangan Metode, dll. Badan metode dikompilasi hanya selama tahap kedua.
Jenis anonim tidak ditentukan hingga badan metode dikompilasi.
Jadi kompilator tidak memiliki cara untuk menentukan tipe kembalian metode selama fase pertama.
Itulah alasan mengapa tipe anonim tidak bisa digunakan sebagai tipe kembalian.
Seperti yang disarankan orang lain jika Anda menggunakan .net 4.0 atau parutan, Anda dapat menggunakan
Dynamic
.Jika saya jadi Anda, saya mungkin akan membuat tipe dan mengembalikan tipe itu dari metode. Dengan begitu, mudah bagi programmer masa depan yang memelihara kode Anda dan lebih mudah dibaca.
sumber
Tiga opsi:
Pilihan 1:
Pilihan 2:
Anda dapat mengulanginya sebagai objek
Opsi 3:
dan Anda akan dapat mengulanginya sebagai objek dinamis dan mengakses propertinya secara langsung
sumber
Anda dapat mengembalikan daftar objek dalam kasus ini.
sumber
Menggunakan C # 7.0 kami masih tidak bisa mengembalikan tipe anonim tapi kami memiliki dukungan tipe tuple dan dengan demikian kami dapat mengembalikan koleksi
tuple
(System.ValueTuple<T1,T2>
dalam kasus ini). SaatTuple types
ini tidak didukung di pohon ekspresi dan Anda perlu memuat data ke dalam memori.Versi terpendek dari kode yang Anda inginkan mungkin terlihat seperti ini:
Atau menggunakan sintaks Linq yang lancar:
Menggunakan C # 7.1 kita dapat menghilangkan nama properti tupel dan mereka akan disimpulkan dari inisialisasi tupel seperti ini bekerja dengan tipe anonim:
sumber
Membuat kelas Anda sendiri dan menanyakannya adalah solusi terbaik yang saya tahu.Seperti yang saya tahu Anda tidak dapat menggunakan nilai kembalian tipe anonim dalam metode lain, karena itu tidak hanya akan dikenali.Namun, mereka dapat digunakan dengan cara yang sama metode. Saya biasa mengembalikannya sebagai
IQueryable
atauIEnumerable
, meskipun masih tidak memungkinkan Anda melihat apa yang ada di dalam variabel tipe anonim.Saya mengalami sesuatu seperti ini sebelumnya ketika saya mencoba memfaktor ulang beberapa kode, Anda dapat memeriksanya di sini: Refactoring dan membuat metode terpisah
sumber
Dengan refleksi.
Sampel:
Keluaran:
sumber
Anda hanya dapat menggunakan kata kunci dinamis,
Tetapi dengan kata kunci tipe dinamis Anda akan kehilangan keamanan waktu kompilasi, IDE IntelliSense dll.
sumber
Opsi lain dapat menggunakan automapper: Anda akan mengonversi ke jenis apa pun dari objek anonim Anda yang dikembalikan selama properti publik cocok. Poin utamanya adalah, mengembalikan objek, menggunakan linq dan autommaper. (atau gunakan ide serupa untuk mengembalikan serialized json, dll. atau gunakan refleksi ..)
sumber
Sekarang dengan fungsi lokal khususnya, tetapi Anda selalu dapat melakukannya dengan mengirimkan delegasi yang membuat tipe anonim.
Jadi, jika tujuan Anda adalah menjalankan logika yang berbeda pada sumber yang sama, dan dapat menggabungkan hasil ke dalam satu daftar. Tidak yakin nuansa apa yang hilang ini untuk memenuhi tujuan yang dinyatakan, tetapi selama Anda mengembalikan
T
dan mengirimkan delegasi untuk membuatnyaT
, Anda dapat mengembalikan tipe anonim dari suatu fungsi.sumber
Sebenarnya dimungkinkan untuk mengembalikan tipe anonim dari metode dalam kasus penggunaan tertentu. Mari kita lihat!
Dengan C # 7 dimungkinkan untuk mengembalikan tipe anonim dari sebuah metode, meskipun itu datang dengan sedikit kendala. Kami akan menggunakan fitur bahasa baru yang disebut fungsi lokal bersama dengan trik tipuan (lapisan tipuan lain dapat menyelesaikan tantangan pemrograman apa pun, bukan?).
Inilah kasus penggunaan yang baru-baru ini saya identifikasi. Saya ingin mencatat semua nilai konfigurasi setelah saya memuatnya dari
AppSettings
. Mengapa? Karena ada beberapa logika di sekitar nilai yang hilang yang kembali ke nilai default, beberapa parsing, dan sebagainya. Cara mudah untuk mencatat nilai setelah menerapkan logika adalah dengan meletakkan semuanya di kelas dan membuat serial ke file log (menggunakan log4net). Saya juga ingin merangkum logika kompleks dalam menangani pengaturan dan memisahkannya dari apa pun yang perlu saya lakukan dengannya. Semua tanpa membuat kelas bernama yang ada hanya untuk sekali penggunaan!Mari kita lihat bagaimana menyelesaikan ini menggunakan fungsi lokal yang membuat tipe anonim.
Saya telah berhasil membangun kelas anonim dan juga merangkum logika berurusan dengan manajemen pengaturan yang kompleks, semua di dalam
CreateHttpClient
dan di dalam "ekspresi" -nya sendiri. Ini mungkin tidak persis seperti yang diinginkan OP tetapi ini adalah pendekatan ringan dengan tipe anonim yang saat ini dimungkinkan dalam C # modern.sumber