2011-11-09 50 views
2

有没有办法为一个开放的泛型类型声明一个vaiable?如何为open generic类型声明变量?可能?

鉴于:用户从工厂方法中获得了一个通用类Logger。有没有办法让一个可以容纳任何记录器的变量?

现在,Logger只从Logger继承,因为它能够为实例声明一个变量而不关心在那里记录了哪种类型。

我使用MEF,并且在导出中,我可以使用类似[Export(typeof(Logger <>))]的语法来导出泛型类型...(指定导入时的确切类型),因此有一些支持对于开放类型(至少在typeof中)。我现在需要的是一种语法,如

Logger <> Logger {get;组; }

有没有可能做类似的事情?这个特殊的语法让我“需要类型”。

+0

为什么不使用'object'? –

+0

@Lasse:我猜是因为'myObject.Log(something)'会产生一个编译错误(即该变量不是* only *用于存储引用)。 'dynamic'会是一个选项,但是你会失去编译时语法检查。 – Heinzi

+0

就是这样。我向日志服务器寻求类型X的记录器(对于配置),但我不想记录到特定的genric类型,所有的东西都是基础的一部分。我有时可能会通过记录器(子类等),他们不需要知道。我试图避免(在这里和其他情况下)基类JUST有一个。 – TomTom

回答

2

如果记录器的类型参数是covariant,即,如果它声明为out modifier,那么您可以使用Logger<object>

IEnumerable<object> = new List<string>; // this works, because IEnumerable is covariant 

如果记录仪的类型参数不是协变的,也就是说,如果您使用它作为一个输入参数的地方,例如然后实现一个通用的接口(或者使用一个通用的基类)似乎是实现你的目标的唯一方法。