当接口具有泛型时,如何从Activator实例化对象?

时间:2011-09-21 00:03:49

标签: c# reflection activator

在我的代码中,我有以下界面

public interface ILogParser<TParserOptions> { }

我已经通过反射检索了所有使用此接口的类型,并且我正在尝试实例化它们。通常我会做一些事情:

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

但是,当您处理泛型时,这不起作用,因为您需要在转换时知道泛型类型,这可能因每种实现类型而异。

这可能吗?

1 个答案:

答案 0 :(得分: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);