Tytuł jest niejasny. Chcę wiedzieć, czy jest to możliwe:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Oczywiście MyGenericClass jest opisany jako:
public class MyGenericClass<T>
W tej chwili kompilator narzeka, że „Nie można znaleźć typu lub przestrzeni nazw„ myType ”.” Musi być na to sposób.
foo.Method((dynamic)myGenericClass)
do powiązania metod w czasie wykonywania, skutecznie wzorzec lokalizatora usługi dla przeciążeń metody typu.public void Method<T>(T obj)
- sztuczka, z której korzystałem więcej niż kilka razy w ciągu ostatnich 6 lat od tego komentarza; pOdpowiedzi:
Nie możesz tego zrobić bez refleksji. Jednakże, można zrobić to z refleksji. Oto kompletny przykład:
Uwaga: jeśli twoja klasa ogólna akceptuje wiele typów, musisz pominąć przecinki, pomijając nazwy typów, na przykład:
źródło
Niestety nie, nie ma. Argumenty ogólne muszą być rozwiązywalne w czasie kompilacji jako 1) prawidłowy typ lub 2) inny parametr ogólny. Nie ma sposobu na utworzenie ogólnych instancji w oparciu o wartości środowiska wykonawczego bez dużego młota przy użyciu odbicia.
źródło
Dodatkowe informacje na temat uruchamiania przy użyciu kodu nożyczek. Załóżmy, że masz klasę podobną do
Załóżmy, że w czasie wykonywania masz FooContent
Gdybyś mógł powiązać w czasie kompilacji, chciałbyś
Jednak nie można tego zrobić w czasie wykonywania. Aby to zrobić w środowisku wykonawczym, wykonaj następujące czynności:
Aby dynamicznie wywoływać
Markdown(IEnumerable<FooContent> contents)
Zwróć uwagę na użycie
dynamic
w wywołaniu metody. W czasie wykonywaniadynamicList
będzieList<FooContent>
(dodatkowo równieżIEnumerable<FooContent>
), ponieważ nawet użycie dynamiki jest nadal zakorzenione w silnie typowanym języku, spoiwo w czasie wykonywania wybierze odpowiedniąMarkdown
metodę. Jeśli nie ma dokładnych dopasowań typu, będzie szukał metody parametru obiektowego, a jeśli nie będzie pasował żaden wyjątek spoiwa środowiska wykonawczego, pojawi się ostrzeżenie, że żadna metoda nie pasuje.Oczywistą wadą tego podejścia jest ogromna utrata bezpieczeństwa typu w czasie kompilacji. Niemniej jednak kod zgodny z tymi liniami pozwoli ci działać w bardzo dynamiczny sposób, że w środowisku wykonawczym jest nadal w pełni wpisany, tak jak się spodziewasz.
źródło
Moje wymagania były nieco inne, ale mam nadzieję, że komuś pomogą. Musiałem odczytać typ z konfiguracji i dynamicznie utworzyć instancję typu ogólnego.
Wreszcie, jak to nazywasz. Zdefiniuj typ za pomocą przycisku wstecz .
źródło
Jeśli wiesz, jakie typy zostaną zaliczone, możesz to zrobić bez refleksji. Instrukcja switch działałaby. Oczywiście działałoby to tylko w ograniczonej liczbie przypadków, ale będzie znacznie szybsze niż refleksja.
źródło
W tym fragmencie chcę pokazać, jak utworzyć i używać dynamicznie tworzonej listy. Na przykład dodaję tutaj listę dynamiczną.
Podobnie możesz wywołać dowolną inną metodę z listy.
źródło