Есть ли способ ограничить доступ к некоторым методам в соответствии с типом, переданным универсальному классу?

#c# #generics

#c# #общие

Вопрос:

В настоящее время я работаю над универсальным классом. Я хочу ограничить доступ к некоторым методам при передаче разных типов. Допустим, это выглядит примерно так:

 public class MyGeneric<T>
{
public void Foo1(){}
public void Foo2(){}
}
  

Я, очевидно, могу использовать typeof оператор для реализации различных поведений, но давайте предположим, что Foo1 считает среднее значение некоторых чисел. Если я передам тип «Student», он может подсчитывать среднее значение оценок. Но, допустим, я передаю «Car», и я не хочу, чтобы он что-либо делал. Иметь его просто там и ничего не делать с этим типом было бы излишним. Есть ли способ полностью ограничить доступ к нему? Спасибо!

Комментарии:

1. в коде, которым вы поделились, метод Foo не принимает никаких параметров. Итак, куда вы передадите Student или Car ? Можете ли вы объяснить проблему с большей ясностью и каким-нибудь более осмысленным кодом?

2. Это все ограничения, которые вы можете объявить при работе с универсальными файлами.

3. @ChetanRanpariya передавая тип, я имел в виду объявление объектов MyGeneric<T> с разными типами, передаваемыми вместо «T».

4. Вы можете использовать функцию ограничения Generics, где она ограничит вас использованием только определенного типа как T. Читайте здесь и здесь

Ответ №1:

Вы могли бы использовать абстракцию / наследование для этого. Создание класса

 public class MyGeneric<T>
{
    public void Foo1(){}
}
  

который обрабатывает все «глобальные» функции, а затем создает дочерний класс, подобный этому:

 public class MyGenericChild<T> : MyGeneric<T> where T : IMyInterface
{
    public void Foo2(){}
}
  

Затем вы можете использовать определенный дочерний элемент для обработки методов, специфичных для конкретного типа.
При необходимости вы могли бы расширить это с помощью заводского шаблона, чтобы восстановить правильный универсальный класс.