C# Уточняет ограничения типа уровня класса в методе

#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...
    }
}