Activator.CreateInstance <T> () parametrelerine nasıl geçilir


236

Sahip olduğum genel bir yöntemde belirttiğim türden bir örnek oluşturmak istiyorum. Bu tip bir dizi aşırı yüklenmiş kurucuya sahiptir. Yapıcılara argüman aktarabilmek istiyorum, ama

Activator.CreateInstance<T>()

bunu bir seçenek olarak görmüyor.

Bunu yapmanın başka bir yolu var mı?


Yanıtlar:



16

Bağımsız değişkenleri adlandırılmış parametreler yoluyla CreateInstance öğesine iletmenin başka bir yolu daha vardır.

Buna dayanarak, bir dizi doğru iletebilirsiniz CreateInstance. Bu, 0 veya birden fazla bağımsız değişkene sahip olmanızı sağlar.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}

2
Bu eksik görünüyor, elbette geçersiz olmak yerine T tipi bir nesneyi döndürmeniz gerekiyor mu? public T CreateInstance <T> (params nesnesi [] paramArray) {return (T) Activator.CreateInstance (typeof (T), args: paramArray); }
wlf

11

Activator.CreateInstance üzerinde argümanları iletmenin parametresiz yaratmaya kıyasla önemli bir performans farkına sahip olduğunu unutmayın.

Önceden derlenmiş lambda kullanarak dinamik olarak nesne oluşturmak için daha iyi alternatifler vardır. Tabii ki her zaman performans özneldir ve buna değip değmediği her duruma bağlıdır.

Bu makaledeki sorunla ilgili ayrıntılar.

Grafik makaleden alınır ve 1000 çağrı başına ms cinsinden geçen süreyi temsil eder.

Performans karşılaştırması


Bağlam için, bu grafik (ortalama olarak, aynı donanımda) parametreli bir kurucunun her çağrısının Activator.CreateInstancealacağı 0.0035ms(veya 3,5 mikrosaniye) anlamına gelir - uygulamanıza bağlı olarak, bu performans testlerine bile kaydolamayabilir.
Dai

6

Activator.CreateInstance'a alternatif olarak, bağlı url'deki FastObjectFactory, Activator'dan daha iyi performans gösterir (.NET 4.0 ve .NET 3.5'ten önemli ölçüde daha iyi. .NET 4.5 ile hiçbir test / istatistik yapılmadı). İstatistikler, bilgi ve kod için StackOverflow yayınına bakın:

Activator.CtorteInstance'da ctor argümanlarını nasıl iletebilirim?


Parametreleri iletirken Activator.CreateInstance'dan daha iyi performans göstermesi muhtemel alternatif bir çözümün (bağlantılı) olduğunu mu demek istediniz? Yoksa her durumda daha iyi performans göstermesi muhtemel mi?
El Zorko

1
Bir süredir performans testleri yapmadım ve birisi .NET 4.0 istatistikleri gönderdi gibi görünüyor, ancak evet .NET 4.0 ile FastObjectFactory daha iyi performansa sahip gibi görünüyor. Activator.CreateInstance, .NET 3.5'te korkunçtu ve .NET 4.0'da önemli ölçüde daha hızlıydı, ancak yine de bu url'de bağlı FastObjectFactory'den daha yavaştı.
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;
    }
}

1
Bu sadece açıklanamayan koddur. Hiç yardımcı olduğuna ve hatta işe yaradığından şüpheliyim. Beni başka türlü ikna etmek için lütfen bunun nasıl çalıştığını ve sorunun neden çözülmesi gerektiğini açıklayın.
Yunnosch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.