Gdy mamy coś takiego:Jak stworzyć skonstruowaną typu rodzajowego bez podania jakiegokolwiek rodzaju parametry
interface ISomething<U,V> { ... }
class Something<U,V> : ISomething<U,V> { ... }
typeof(ISomething<,>)
i typeof(Something<,>)
spowoduje „ogólnych definicji typu”. Ale jeśli mamy do rodzaju interfejsu jako interfejs realizowanego przez klasę, będzie to rodzaj skonstruowane, że żaden z jego parametrów typu są faktycznie związane:
typeof(Something<,>).GetInterfaces().SingleOrDefault()
MSDN specjalnie wspomina o tym. To, czego chcę, to skonstruowanie tego samego typu (typu skonstruowanego) o wartości ISomething<,>
bezpośrednio (bez podklasy i szukających typu bazowego) i nie mogłem znaleźć żadnego sposobu, aby to zrobić.
Dodatkowe informacje:
Próbowałem nawet to:
Type t1 = typeof(ISomething<,>);
Type t2 = t1.MakeGenericType(t1.GetGenericArguments()) // Yields a generic type definition
Type t3 = typeof(Something<,>).GetInterfaces().SingleOrDefault();
W powyższym kodzie:
t1.Equals(t2)
to prawda, ale t1.Equals(t3)
jest fałszywa, ponieważ t3
oczywiście jest zbudowany.
Co zaskakujące, t1.GetGenericArguments()[0].Equals(t3.GetGenericArguments()[0])
jest fałszywe, chociaż oba są otwarte (IsGenericParameter = true) i nie mogłem znaleźć żadnej różnicy w ich właściwościach.
Oto, dlaczego muszę to zrobić: Potrzebuję kanonicznej formy przechowywania obiektów typu na liście. Obiekty czasami pochodzą z klas bazowych/interfejsów (takich jak t3 powyżej), a czasami bezpośrednio (takich jak t1). Będę musiał móc porównać je ze sobą. Nie mogę zapisać ogólnej definicji typu (używając .GetGenericTypeDefinition()
), ponieważ czasami będę miał częściowo otwarty zbudowany rodzaj ogólny (jak ISomething), a GetGenericTypeDefinition da mi typ bez określonych argumentów typu.
Jedynym sposobem na stworzenie kanonicznych typów, o których myślę, że może działać, jest sprawdzenie, czy wszystkie argumenty typu są niezwiązane i wykonanie GetGenericTypeDefinition. W przeciwnym razie zachowaj skonstruowany typ.
I nie sądzę, że to działa: „sprawdź, czy wszystkie argumenty typu są niezwiązane i wykonaj GetGenericTypeDefinition, w przeciwnym razie zachowaj skonstruowany typ. " Załóżmy, że masz typ "I ". Wszystkie argumenty typu są niezwiązanymi parametrami typu, ale jest to inny typ niż 'I '. –
Odp: "Zaskakująco ..." - to wcale nie jest zaskakujące. Podejrzewam, że częścią tego zamieszania jest to, że masz dwa zupełnie różne typy o nazwie "U" i dwa zupełnie różne typy o nazwie "V". Oczywiście 'I <,>' różni się od 'I ' na zaimplementowanej liście interfejsu; pierwsza jest sparametryzowana za pomocą '' zadeklarowanej przez 'I', a druga jest sparametryzowana za pomocą' 'zadeklarowanej przez' Something'. Tylko dlatego, że parametry typu mają takie same nazwy, nie są tego samego typu. –
Jeśli mam skonstruowane 'I ' i wywołanie na GetGenericTypeDefinition() na nim, da mi 'typeof (I )'? – Iravanchi