Chcę utworzyć instancję typu określonego przeze mnie w ogólnej metodzie. Ten typ ma wiele przeciążonych konstruktorów. Chciałbym móc przekazywać argumenty konstruktorom, ale
Activator.CreateInstance<T>()
nie widzi tego jako opcji.
Czy jest na to inny sposób?
c#
generics
createinstance
DaveDev
źródło
źródło
Odpowiedzi:
Tak.
źródło
Istnieje inny sposób przekazywania argumentów do obiektu CreateInstance za pomocą nazwanych parametrów.
Na tej podstawie możesz przekazać tablicę w kierunku
CreateInstance
. To pozwoli ci mieć 0 lub wiele argumentów.źródło
Pamiętaj jednak, że przekazywanie argumentów na Activator.CreateInstance ma znaczącą różnicę wydajności w porównaniu do tworzenia bez parametrów.
Istnieją lepsze alternatywy dla dynamicznego tworzenia obiektów za pomocą wstępnie skompilowanej lambdy. Oczywiście zawsze wydajność jest subiektywna i wyraźnie zależy od każdego przypadku, czy jest tego warta, czy nie.
Szczegóły dotyczące problemu w tym artykule.
Wykres pochodzi z artykułu i przedstawia czas w ms na 1000 połączeń.
źródło
Activator.CreateInstance
zajmie0.0035ms
(lub 3,5 mikrosekundy) - w zależności od aplikacji może to nawet nie zarejestrować się w testach wydajności.Jako alternatywa dla Activator.CreateInstance, FastObjectFactory w połączonym adresie URL działa lepiej niż Activator (od .NET 4.0 i znacznie lepiej niż .NET 3.5. Brak testów / statystyk z .NET 4.5). Zobacz wpis StackOverflow zawierający statystyki, informacje i kod:
Jak przekazać argumenty ctor w Activator.CreateInstance lub użyć IL?
źródło
źródło