Mam więc klasę, która akceptuje ogólny parametr typu i wykonuje trochę specjalną obsługę, jeśli parametr typu jest podklasą danego typu.Generowanie rzutowania typu ogólnego w zapytaniu linq
IEnumerable<T> models = ...
// Special handling of MySpecialModel
if (filterString != null && typeof(MySpecialModel).IsAssignableFrom(typeof(T)))
{
var filters = filterString.Split(...);
models =
from m in models.Cast<MySpecialModel>()
where (from t in m.Tags
from f in filters
where t.IndexOf(f, StringComparison.CurrentCultureIgnoreCase) >= 0
select t)
.Any()
select (T)m;
}
Ale ja dostaję wyjątek w ostatnim wierszu
Cannot convert type 'MySpecialModel' to 'T'
Gdybym zmienić kod do korzystania as
zamiast odlewania, otrzymuję ten błąd.
The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint.
Czego mi tu brakuje?
Aktualizacja
Ta klasa potrzeby może podjąć każdą parametr typu, w tym struct
s oraz wbudowanych typów, więc ogólna ograniczenie nie byłoby odpowiednim rozwiązaniem w moim przypadku.
czy ustawiłeś ograniczenie 'where T: class' w swojej klasie ogólnej? –
@danradu Nie, ale to nie zadziałałoby w moim przypadku, ponieważ klasa generyczna może akceptować zarówno parametry referencyjne, jak i typu wartości. –
@ p.s.w.g, patrz aktualizacja – smartcaveman