Powiedzmy, że mam ogólny element w klasie lub metodzie, więc:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Kiedy instancję klasy, T
staje się MyTypeObject1
, więc klasa ma ogólną listę właściwość: List<MyTypeObject1>
. To samo dotyczy metody ogólnej w klasie innej niż ogólna:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Chciałbym wiedzieć, jaki rodzaj obiektów zawiera lista mojej klasy. Tak więc właściwość list o nazwie Bar
lub zmienna lokalna baz
zawiera jakiego typu T
?
Nie mogę tego zrobić Bar[0].GetType()
, ponieważ lista może zawierać zero elementów. Jak mogę to zrobić?
object
,IList
lub podobne - ale może to równie dobrze być prawidłowa odpowiedź.typeof
. Jeśli chcesz poznać typ T, po prostu użyjtypeof(T)
:)typeof()
parametru ogólnego. Czy masz jakiś przykład, w którym to by nie działało? A może mylisz parametry typu i odwołania?(uwaga: jestem przy założeniu, że wszystko wiesz, to
object
alboIList
lub podobne, i że lista może być dowolnego typu przy starcie)Jeśli wiesz, że to jest
List<T>
, to:Inną opcją jest spojrzenie na indeksator:
Korzystanie z nowego TypeInfo:
źródło
Dzięki poniższej metodzie przedłużenia możesz uciec bez refleksji:
Lub bardziej ogólnie:
Stosowanie:
źródło
T
kompilacji. W takim przypadku tak naprawdę nie potrzebujesz żadnego kodu.ItemType
Próbować
źródło
GetGenericArguments
metoda zwraca obiekt ArrayType
, którego należy następnie przeanalizować pozycję typu ogólnego, którego potrzebujesz. Takich jakType<TKey, TValue>
: musiszGetGenericArguments()[0]
zdobyćTKey
typ iGetGenericArguments()[1]
uzyskaćTValue
typTo dla mnie praca. Gdzie myList jest listą nieznaną.
źródło
<T>
)List
jest już implementacjąIEnumerable
, więc obsada wydaje się nic nie dodawać. Ale dzięki, to dobre rozwiązanie.Jeśli nie potrzebujesz całej zmiennej Type i po prostu chcesz sprawdzić typ, możesz łatwo utworzyć zmienną temp i użyć operatora.
źródło
Możesz użyć tego do zwracania ogólnej listy:
źródło
Zastanów się: używam go do eksportowania listy 20 typów w ten sam sposób:
źródło
new T();
zrobiłbym to samo, co(T)Activator.CreateInstance(typeof(T));
. Wymaga to dodaniawhere T : new()
do definicji klasy / funkcji, ale jeśli tak chcesz tworzyć obiekty, i tak należy to zrobić.GetType
naFirstOrDefault
wejściu w wyniku potencjalnego wyjątkiem odniesienia zerowa. Jeśli masz pewność, że zwróci co najmniej jeden przedmiot, dlaczego nie użyćFirst
zamiast tego?Używam tej metody rozszerzenia do osiągnięcia czegoś podobnego:
Używasz go w ten sposób:
Nie jest to dokładnie to, czego szukasz, ale jest pomocne w zademonstrowaniu technik.
źródło
The
GetGenericArgument()
Metoda musi być ustawiony na typ bazowy instancji (którego klasa jest klasą rodzajowąmyClass<T>
). W przeciwnym razie zwraca typ [0]Przykład:
źródło
Możesz uzyskać typ „T” z dowolnego typu kolekcji, który implementuje IEnumerable <T>, w następujący sposób:
Zauważ, że nie obsługuje typów kolekcji, które implementują IEnumerable <T> dwa razy, np
Przypuszczam, że możesz zwrócić tablicę typów, jeśli potrzebujesz obsługiwać to ...
Możesz także chcieć buforować wynik według typu kolekcji, jeśli często to robisz (np. W pętli).
źródło
źródło
Korzystanie z rozwiązania 3dGrabber:
źródło
Jeśli chcesz poznać typ nieruchomości, spróbuj:
źródło
Tak to zrobiłem
Nazwij to tak
LUB
źródło
Rodzaj:
źródło
SingleOrDefault()
rzuca również,InvalidOperationException
gdy są dwa lub więcej elementów.