Czy ktoś może Activator.CreateInstance()
szczegółowo wyjaśnić cel?
c#
.net
reflection
Tabriz Atayi
źródło
źródło
CreateInstance(Type type)
jest dopasowana doCreateInstance<T>()
przeciążenia.c#.net
sposób na zrobienie tegoObject xyz = Class.forName(className).newInstance();
.Odpowiedzi:
Załóżmy, że masz zajęcia o nazwie
MyFancyObject
takiej jak ta poniżej:Pozwala skręcić:
W
Za pomocą
a potem może robić takie rzeczy jak:
To jest jego cel. Ma również wiele innych przeciążeń, takich jak podawanie
Type
zamiast nazwy klasy w ciągu. Dlaczego miałbyś taki problem, to inna historia. Oto kilka osób, które tego potrzebowały:źródło
String ClassName = "My.Namespace.MyFancyObject";
.).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
ale zamiast rzucać z typem. Cast z typem wykonanym z ClassName? Jak toType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Cóż, mogę podać przykład, dlaczego warto używać czegoś takiego. Pomyśl o grze, w której chcesz przechowywać swój poziom i wrogów w pliku XML. Kiedy parsujesz ten plik, możesz mieć taki element.
co możesz teraz zrobić, to dynamicznie tworzyć obiekty znalezione w pliku poziomu.
Jest to bardzo przydatne przy budowaniu dynamicznych środowisk. Oczywiście możliwe jest również użycie tego w scenariuszach wtyczek lub dodatków i nie tylko.
źródło
Mój dobry przyjaciel MSDN może ci to wyjaśnić na przykładzie
Oto kod na wypadek zmiany linku lub treści w przyszłości:
źródło
Możesz też to zrobić -
źródło
.Unwrap()
dokładnie robi i jak to się ma do innych rozwiązań?CreateInstance
którego wracaSystem.Runtime.Remoting.ObjectHandle
.Dobry przykład może być następny: na przykład masz zestaw rejestratorów i pozwalasz użytkownikowi określić typ, który ma być używany w środowisku wykonawczym, za pośrednictwem pliku konfiguracyjnego.
Następnie:
LUB inny przypadek to sytuacja, gdy masz wspólną fabrykę jednostek, która tworzy jednostkę i jest również odpowiedzialna za inicjalizację jednostki przez dane otrzymane z DB:
(pseudo kod)
źródło
typeof(loggerType)
skutkujeloggerType is a variable and used like a type
Activator.CreateInstance
Metoda tworzy instancję określonego typu przy użyciu konstruktora, który najlepiej pasuje do podanych parametrów.Na przykład, powiedzmy, że masz nazwę typu jako ciąg i chcesz użyć tego ciągu do utworzenia wystąpienia tego typu. Możesz użyć
Activator.CreateInstance
do tego:Oto artykuł MSDN, który bardziej szczegółowo wyjaśnia jego zastosowanie:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
źródło
new Foo()
. Myślę, że PO chciał bardziej realistycznego przykładu.CreateInstance
jest to, że nie znasz typu obiektu, który zamierzasz utworzyć w czasie projektowania. W tym przykładzie wyraźnie wiesz, że jest to typ,Foo
ponieważ rzutujesz go jako typFoo
. Nigdy byś tego nie zrobił, ponieważ możesz to zrobićFoo foo = new Foo()
.Opierając się na deepee1 i tym , oto jak zaakceptować nazwę klasy w ciągu, a następnie użyć jej do odczytu i zapisu w bazie danych za pomocą LINQ. Używam „dynamicznego” zamiast rzutowania deepee1, ponieważ pozwala mi przypisywać właściwości, co pozwala nam dynamicznie wybierać i operować na dowolnej tabeli.
źródło
Dlaczego miałbyś go używać, skoro znałeś już klasę i zamierzałeś ją obsadzić? Dlaczego nie zrobić tego w staroświecki sposób i sprawić, by klasa była taka, jak zawsze? Nie ma to żadnej przewagi nad sposobem, w jaki jest to robione normalnie. Czy istnieje sposób, aby wziąć tekst i operować na nim w ten sposób:
Jeśli już wiem, że to pizza, nie ma żadnej korzyści, aby:
ale widzę ogromną zaletę metody Magic, jeśli taka istnieje.
źródło
W połączeniu z refleksją odkryłem, że Activator.CreateInstance jest bardzo pomocny w mapowaniu wyniku procedury składowanej na klasę niestandardową, jak opisano w poniższej odpowiedzi .
źródło