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



在我的代码中,我有以下接口

public interface ILogParser<TParserOptions> { }

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

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

然而,这在处理泛型时不起作用,因为您需要在强制转换时知道泛型类型,这可能因每个实现的类型而异。

这可能吗?

您可以使用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);

相关内容

  • 没有找到相关文章

最新更新