2009-07-09 2 views
5

Я хочу, чтобы достичь чего-то вроде этого в C# 3.5:Как установить ограничение интерфейса на общий метод в C# 3.5?

public void Register<T>() : where T : interface {} 

я могу сделать это с классом или структуры, но как сделать это с интерфейсом?

+1

дубликата http://stackoverflow.com/questions/1096568/how-can-i-use-interface- as-ac-generic-type-constraint –

ответ

4

C# и CLR не поддерживают общие ограничения интерфейса, хотя вы можете ограничить его конкретным интерфейсом (см. Другие ответы). Ближе всего вы можете получить «класс» и проверить тип, используя отражение во время выполнения, я боюсь. Зачем вам в первую очередь нужно ограничение интерфейса?

+0

Возможно, для пользовательской/сумасшедшей внедренной инъекции зависимостей. Но это я догадываюсь. – Felype

6

Если вы спрашиваете о добавлении ограничения на конкретный интерфейс, это просто:

public void Register<T>(T data) where T : ISomeInterface 

Если вы спрашиваете, существует ли ключевое слово как класс или структуры, чтобы ограничить диапазон возможных типов для Т, т.е. недоступно.

В то время как вы можете написать:

public void Register<T>(T data) where T : class // (or struct) 

Вы не можете написать:

public void Register<T>(T data) where T : interface 
0

Вы не можете требовать, что Т представляет собой интерфейс, так что вам придется использовать отражение во время выполнения, чтобы утверждать это.

0

Если возможно, я пошел с таким решением. Он работает только в том случае, если вы хотите, чтобы несколько конкретных интерфейсов (например, те, к которым у вас есть исходный доступ), были переданы как общий параметр, а не какой-либо.

  • Я позволю своим интерфейсам, которые подверглись сомнению, наследовать пустой интерфейс IInterface.
  • Я сдерживали общий параметр T, чтобы быть IInterface

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

  • Любой интерфейс вы хотите передать в качестве родового параметра:

    public interface IWhatever : IInterface 
    { 
        // IWhatever specific declarations 
    } 
    
  • IInterface:

    public interface IInterface 
    { 
        // Nothing in here, keep moving 
    } 
    
  • класс, на котором вы хотите поставить ограничение типа:

    public class WorldPieceGenerator<T> where T : IInterface 
    { 
        // Actual world piece generating code 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^