Укажите родовые объекты, где T должен быть интерфейсом - PullRequest
3 голосов
/ 09 февраля 2012

Я думал о универсальном методе, где T должен быть интерфейсом, но он может быть потомком IFace

public static T Get<T>(SomeClass foo) where T : IFace {
  if(smthing)
    return Activator.CreateInstance(type, true);
}

так что я могу позвонить

Class.Get<IFace>(smth)
Class.Get<IFaceDescend>(smt)

но не

Class.Get<Class2>(smt)

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Это невозможно в текущем C #.

Единственное, что вы можете сделать, это проверить факт во время выполнения, используя что-то вроде

if (!typeof(T).IsInterface) throw new ArgumentException("T must be an interface");

(Обратите внимание, что нет TypeArgumentException что может быть лучшим выбором, я думаю.)

4 голосов
/ 09 февраля 2012

Нет, вы не можете этого сделать.Вы можете проверить это во время выполнения:

if (!typeof(T).IsInterface)
{
    throw ...;
}

... но вы не можете выразить это как ограничение времени компиляции для T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...