Итак, у меня есть класс, который принимает параметр типового типа и выполняет небольшую специальную обработку, если параметр типа является подклассом заданного типа.Кастинг родовой тип в запросе 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;
}
Но я получаю исключение на последней строке
Cannot convert type 'MySpecialModel' to 'T'
Если изменить код, чтобы использовать as
вместо литья, я получаю эту ошибку.
The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint.
Что мне здесь не хватает?
Update
Этот класс потребностей может принимать любой параметр типа, в том числе struct
с и встроенными типами, поэтому общее ограничение не будет подходящим решением в моем случае.
Вы установили ограничение 'where T: class' в ваш общий класс? –
@ danradu Нет, но это не сработает в моем случае, поскольку общий класс может принимать как ссылочные, так и значения типа. –
@ p.s.w.g, см. Обновление – smartcaveman