Cara Melewati Parameter ke Activator.CreateInstance <T> ()

236

Saya ingin membuat contoh tipe yang saya tentukan dalam metode generik yang saya miliki. Tipe ini memiliki sejumlah konstruktor yang kelebihan beban. Saya ingin bisa memberikan argumen kepada konstruktor, tetapi

Activator.CreateInstance<T>()

tidak melihat memiliki ini sebagai opsi.

Apakah ada cara lain untuk melakukannya?

DaveDev
sumber

Jawaban:

458

Iya.

(T)Activator.CreateInstance(typeof(T), param1, param2);
Slaks
sumber
2
Saya suka jawaban ini ;-)
frhack
16

Ada cara lain untuk meneruskan argumen ke CreateInstance melalui parameter bernama.

Berdasarkan itu, Anda dapat meneruskan array ke CreateInstance. Ini akan memungkinkan Anda untuk memiliki 0 atau beberapa argumen.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
sudhAnsu63
sumber
2
Ini sepertinya tidak lengkap, tentunya Anda perlu mengembalikan objek bertipe T daripada batal? public T CreateInstance <T> (objek params [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf
11

Perlu diingat bahwa argumen yang lewat pada Activator.CreateInstance memiliki perbedaan kinerja yang signifikan versus pembuatan tanpa parameter.

Ada alternatif yang lebih baik untuk membuat objek secara dinamis menggunakan lambda yang sudah dikompilasi. Tentu saja selalu kinerja subjektif dan jelas tergantung pada setiap kasus apakah itu layak atau tidak.

Detail tentang masalah pada artikel ini.

Grafik diambil dari artikel dan mewakili waktu yang diambil dalam ms per 1000 panggilan.

Perbandingan kinerja

Anestis Kivranoglou
sumber
Untuk konteks, bagan ini berarti bahwa (rata-rata, pada perangkat keras yang sama) setiap doa dari konstruktor parameter dengan Activator.CreateInstanceakan mengambil 0.0035ms(atau 3,5 mikrodetik) - tergantung pada aplikasi Anda ini bahkan mungkin tidak mendaftar dalam tes kinerja sama sekali.
Dai
6

Sebagai alternatif untuk Activator.CreateInstance, FastObjectFactory di dalam url tertaut lebih baik daripada Activator (pada. NET 4.0 dan secara signifikan lebih baik daripada. NET 3.5. Tidak ada tes / statistik yang dilakukan dengan .NET 4.5). Lihat posting StackOverflow untuk statistik, info, dan kode:

Bagaimana cara melewati argumen ctor di Activator.CreateInstance atau menggunakan IL?

thames
sumber
Apakah maksud Anda ada solusi alternatif (ditautkan) yang cenderung berkinerja lebih baik daripada Activator.CreateInstance saat Anda memberikan parameter? Atau itu cenderung berkinerja lebih baik dalam semua kasus?
El Zorko
1
Saya belum melakukan tes kinerja dalam beberapa saat dan sepertinya seseorang memposting statistik .NET 4.0, tapi ya dengan .NET 4.0 sepertinya FastObjectFactory memiliki kinerja yang lebih baik. Activator.CreateInstance mengerikan di. NET 3.5 dan secara signifikan lebih cepat di. NET 4.0 namun masih lebih lambat dari FastObjectFactory yang terhubung dalam url itu.
thames
1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}
Carga dinamica de dll
sumber
1
Ini hanya kode yang tidak dijelaskan. Saya ragu itu membantu atau bahkan bekerja sama sekali. Untuk meyakinkan saya sebaliknya tolong jelaskan bagaimana ini bekerja dan mengapa itu seharusnya menyelesaikan masalah.
Yunnosch