Как создать экземпляр объекта из Activator, если его интерфейс имеет универсальные шаблоны?

В моем коде у меня есть следующий интерфейс

public interface ILogParser<TParserOptions> { }

Я нашел все типы, которые используют этот интерфейс через отражение, и я пытаюсь создать их экземпляр. Обычно я делал бы что-то вроде:

var parser = (ILogParser)Activator.CreateInstance(parserType)

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

Это возможно?

1 ответ

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

Когда у вас есть соответствующий тип (с указанием универсального типа), Activator.CreateInstance будет работать нормально.

Например, в приведенном выше, вы можете использовать:

Type interfaceType = typeof(LogParser<>); // Some class that implements ILogParser<T>
// Make the appropriate type - 
// Note: if this is in a generic method, you can use typeof(T)
Type fullType = interfaceType.MakeGenericType( new[] { typeof(Int32) });

object result = Activator.CreateInstance(fullType);
Другие вопросы по тегам