Anda dapat melihat apa yang saya coba (tetapi gagal) lakukan dengan kode berikut:
protected T GetObject()
{
return new T();
}
Bantuan apa pun akan sangat dihargai.
EDIT:
Konteksnya adalah sebagai berikut. Saya bermain-main dengan kelas pengontrol khusus untuk berasal dari semua pengontrol, dengan metode standar. Jadi dalam konteksnya, saya perlu membuat instance objek tipe controller yang baru. Jadi pada saat penulisan, itu seperti:
public class GenericController<T> : Controller
{
...
protected T GetObject()
{
return (T)Activator.CreateInstance(ObjectType);
}
public ActionResult Create()
{
var obj = GetObject()
return View(obj);
}
Jadi saya putuskan refleksi paling mudah di sini. Saya setuju bahwa, tentu saja memberikan pernyataan awal dari pertanyaan, jawaban yang paling tepat untuk menandai sebagai benar adalah yang menggunakan kendala () baru. Saya sudah memperbaikinya.
Jawaban:
Lihatlah Kendala baru
T
bisa berupa kelas yang tidak memiliki konstruktor default: dalam hal ininew T()
akan menjadi pernyataan yang tidak valid. Thenew()
kendala mengatakan bahwaT
harus memiliki konstruktor default, yang membuatnew T()
hukum.Anda dapat menerapkan batasan yang sama untuk metode generik:
Jika Anda harus melewati parameter:
sumber
Kenapa tidak ada yang menyarankan
Activator.CreateInstance
?http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
sumber
Cara lain adalah dengan menggunakan refleksi:
sumber
Hanya untuk penyelesaian, solusi terbaik di sini adalah sering membutuhkan argumen fungsi pabrik:
dan menyebutnya sesuatu seperti ini:
Anda dapat menggunakannya untuk meminta atau memanfaatkan parameter yang tersedia, jika perlu.
sumber
The kendala baru baik-baik saja, tapi jika Anda membutuhkan T menjadi jenis nilai juga, gunakan ini:
sumber
Karena ini ditandai C # 4. Dengan kerangka kerja open source, ImpromptuIntereface akan menggunakan dlr untuk memanggil konstruktor, ini secara signifikan lebih cepat daripada Activator ketika konstruktor Anda memiliki argumen, dan secara lambat lebih lambat ketika tidak. Namun keuntungan utama adalah bahwa ia akan menangani konstruktor dengan parameter opsional C # 4.0 dengan benar, sesuatu yang tidak akan dilakukan Activator.
sumber
Untuk mendapatkan ini saya mencoba kode berikut:
sumber