Weź następującą klasę jako przykład:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Następnie chcę utworzyć instancję tego typu za pomocą odbicia:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Zwykle to zadziała, jednak ponieważ SomeType
nie zdefiniowano konstruktora bez parametrów, wywołanie Activator.CreateInstance
wyrzuci wyjątek typu MissingMethodException
z komunikatem „ Nie zdefiniowano konstruktora bez parametrów dla tego obiektu ” . Czy istnieje alternatywny sposób tworzenia instancji tego typu? Byłoby trochę nieciekawe, gdyby dodać konstruktory bez parametrów do wszystkich moich klas.
FormatterServices.GetUninitializedObject
nie pozwala na utworzenie niezainicjowanego ciągu. Możesz otrzymać wyjątek:System.ArgumentException: Uninitialized Strings cannot be created.
pamiętaj o tym.Odpowiedzi:
Pierwotnie opublikowałem tę odpowiedź tutaj , ale tutaj jest przedruk, ponieważ nie jest to dokładnie to samo pytanie, ale ma tę samą odpowiedź:
FormatterServices.GetUninitializedObject()
utworzy instancję bez wywoływania konstruktora. Znalazłem tę klasę, używając Reflectora i przeglądając niektóre z podstawowych klas serializacji .Net.Przetestowałem to używając przykładowego kodu poniżej i wygląda na to, że działa świetnie:
źródło
Użyj tego przeciążenia metody CreateInstance:
Zobacz: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
źródło
Kiedy testowałem wydajność
(T)FormatterServices.GetUninitializedObject(typeof(T))
, było wolniej. W tym samym czasie skompilowane wyrażenia dałyby ci dużą poprawę szybkości, chociaż działają tylko dla typów z domyślnym konstruktorem. Przyjąłem podejście hybrydowe:Oznacza to, że wyrażenie create jest skutecznie buforowane i wiąże się z karą tylko przy pierwszym ładowaniu typu. Obsługuje również typy wartości w efektywny sposób.
Nazwać:
Zauważ, że
(T)FormatterServices.GetUninitializedObject(t)
nie powiedzie się to dla stringa. W związku z tym istnieje specjalna obsługa łańcucha, aby zwrócić pusty łańcuch.źródło
Dobre odpowiedzi, ale bezużyteczne w kompaktowej strukturze dot net. Oto rozwiązanie, które będzie działać na CF.Net ...
źródło