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

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

public interface ILogParser<TParserOptions> { }

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

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

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

Возможно ли это?

1 Ответ

1 голос
/ 21 сентября 2011

Вы можете использовать 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);
...