Как создать экземпляр объекта из 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);