#c# #generics
Вопрос:
У меня есть универсальный класс, который является оболочкой списка. У меня есть метод, который я хочу использовать только тогда, когда T является определенным типом. Компилятор этим недоволен. Названия были упрощены для краткости, но структура и цель остаются:
public class MyCollection<T> : List<T> //T can be anything here
{
..snip many methods that dont care about the type of T...
public List<U> Specialize<U>()
where U : new()
where T : ISpecializable
{
...some reflection and conversion magic...
}
}
Возможно ли это? Есть ли лучший способ сделать это? Как бы то ни было, компилятор сообщает мне, что метод не определяет T,но если я включу его как Specialize<T, U> (), то он предупредит меня, что T скрывает версию уровня класса, и это не будет работать так, как я хочу. Я не хочу переносить ограничение на уровень класса, потому что я хочу, чтобы другие методы работали независимо. У меня это «работает» прямо сейчас, выполнив явную проверку типа в методе и выдав исключение аргумента, если оно неверно, но это проверка во время выполнения, и я бы предпочел ограничение, потому что это проверка во время компиляции.
Комментарии:
1. Нет, это невозможно.
2. Рассматривали ли вы возможность определения метода расширения?
Ответ №1:
Вы могли бы решить эту проблему с помощью двух классов, у одного есть член, у другого его нет. У одного с методом есть ограничения типа, у другого-нет.
public class SpecializableCollection<T> : MyCollection<T>
where T: new(), ISpecializable
{
..snip many methods that dont care about the type of T...
public List<T> Specialize<T>()
{
...some reflection and conversion magic...
}
}
Также вы могли бы достичь этого с помощью метода расширения:
public static class SpecializableExtensions
{
public static List<T> Specialize<T>(this MyCollection<T> specializable)
where T : new(), ISpecializable
{
...some reflection and conversion magic...
}
}