Как поместить ограничение интерфейса на универсальный метод в C # 3.5? - PullRequest
5 голосов
/ 09 июля 2009

Я хочу добиться чего-то подобного в C # 3.5:

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

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

Ответы [ 4 ]

6 голосов
/ 09 июля 2009

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

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

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

Пока можно написать:

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

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

public void Register<T>( T data ) where T : interface
4 голосов
/ 09 июля 2009

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

0 голосов
/ 31 января 2015

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

  • Я позволил моим интерфейсам, которые оказались под вопросом, наследовать пустой интерфейс 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
    }
    
0 голосов
/ 09 июля 2009

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

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