Я хочу, чтобы достичь чего-то вроде этого в C# 3.5:Как установить ограничение интерфейса на общий метод в C# 3.5?
public void Register<T>() : where T : interface {}
я могу сделать это с классом или структуры, но как сделать это с интерфейсом?
Я хочу, чтобы достичь чего-то вроде этого в C# 3.5:Как установить ограничение интерфейса на общий метод в C# 3.5?
public void Register<T>() : where T : interface {}
я могу сделать это с классом или структуры, но как сделать это с интерфейсом?
C# и CLR не поддерживают общие ограничения интерфейса, хотя вы можете ограничить его конкретным интерфейсом (см. Другие ответы). Ближе всего вы можете получить «класс» и проверить тип, используя отражение во время выполнения, я боюсь. Зачем вам в первую очередь нужно ограничение интерфейса?
Возможно, для пользовательской/сумасшедшей внедренной инъекции зависимостей. Но это я догадываюсь. – Felype
Если вы спрашиваете о добавлении ограничения на конкретный интерфейс, это просто:
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
Вы не можете требовать, что Т представляет собой интерфейс, так что вам придется использовать отражение во время выполнения, чтобы утверждать это.
Если возможно, я пошел с таким решением. Он работает только в том случае, если вы хотите, чтобы несколько конкретных интерфейсов (например, те, к которым у вас есть исходный доступ), были переданы как общий параметр, а не какой-либо.
IInterface
.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
}
дубликата http://stackoverflow.com/questions/1096568/how-can-i-use-interface- as-ac-generic-type-constraint –