【问题标题】:How to declare variable for open generic type? Possible?如何为开放的泛型类型声明变量?可能的?
【发布时间】:2011-11-09 09:37:14
【问题描述】:

有没有办法为开放的泛型类型声明一个变量?

Given:有一个通用类 Logger,用户可以从工厂方法中获取。有没有办法拥有一个可以容纳任何记录器的变量?

现在 Logger 继承自 Logger 只是为了能够为实例声明一个变量,而无需关心那里记录的是什么类型。

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

的语法

记录器记录器 { 获取;放; }

有可能做这样的事情吗?这种特殊的语法让我“需要类型”。

【问题讨论】:

  • @Lasse:我猜是因为myObject.Log(something) 会产生编译错误(即变量不是用于存储引用)。 dynamic 是一个选项,但你会失去编译时语法检查。
  • 就是这样。我向日志服务询问类型 X(用于配置)的 Logger,但我对记录到特定的通用类型不感兴趣,所有的东西都是基础的一部分。我有时可能会传递记录器(子类等),他们不需要知道。我尽量避免(在这里和其他情况下)基类只是为了拥有一个。
  • 那么接口就是要走的路。将您需要的功能隔离到一个界面中,然后改用它。

标签: c# open-generics


【解决方案1】:

如果Logger的类型参数是covariant,即如果用out modifier声明,那么你可以直接使用Logger<object>

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

如果 Logger 的类型参数不是协变的,即,如果你在某处将它用作 输入参数,例如Log(T dataToLog),那么实现一个通用接口(或使用一个通用基类)似乎是实现目标的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多