将泛型类转换为接口

2024-05-03

我在将泛型类转换为它正在实现的接口时遇到问题。

我的代码是这样的:

interface foo
{
    void foobar();
}

class bar: foo
{
    public void foobar()
    {
        throw new NotImplementedException();
    }
}

现在我的工厂通过接口创建类的实例,主要是一个简单的微内核(服务定位器)。我在这里将其简化。通常它会从配置中查找实现类,并且工厂将类型视为 T 但这对于我遇到的问题并不重要。

public static class Factory
{


    public static Lazy<foo> CreateLazyInstance()
    {
        Lazy<foo> instance;


        Type type = typeof(bar);

        Type lazyType = typeof(Lazy<>);
        Type toContruct = lazyType.MakeGenericType(type);

        instance = (Lazy<foo>)Activator.CreateInstance(toContruct);

        return instance;
    }
}

如果将失败于:

instance = (Lazy<foo>)Activator.CreateInstance(toContruct);

并用 InvalidCastException 声明不可能强制转换类型Lazy<bar> to Lazy<foo>.

有什么方法可以告诉 CLR 这个转换可以工作或者解决这个问题吗?


No - Lazy<T> http://msdn.microsoft.com/en-us/library/dd642331.aspx is 不变的 - so a Lazy<string>不是一个Lazy<object>例如。 (正如评论中指出的,它不能被声明为协变T,因为它是一个类,而不是接口或委托。)

但是,您可以轻松地将一种转换为另一种:

static Lazy<TOutput> CreateLazyProxy<TInput, TOutput>
    (Lazy<TInput> input) where TInput : TOutput
{
    return new Lazy<TOutput>(() => input.Value);
}

Also, Func<T> is协变,所以这也可以工作:

static Lazy<TOutput> CreateLazy<TInput, TOutput>(Func<TInput> func)
    where TInput : TOutput
{
    return new Lazy<TOutput>(func);
}

(并不是说您特别需要一种方法 - 如果您已经got a Func<TInput>,只需构造一个Lazy<TOutput>直接地。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将泛型类转换为接口 的相关文章

随机推荐

  • 可视化时间序列时标记特定日期

    我有一个包含几年数据的时间序列 例如 ts pd Series np random randn 1000 index pd date range 1 1 2000 periods 1000 ts ts cumsum ts plot 我还有两
  • 基于鼠标位置的平滑滚动(Jquery)

    HI 我想创建一个基于鼠标位置的平滑滚动条 这个想法是创建一个具有固定宽度的外部 div 内容非常宽 必须根据鼠标位置向左或向右滚动 如果内容是 无限 或 无尽 的 那就太好了 内容是一个非常宽的图像 无缝 地重复 有人可以帮我用 jQue
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 将字符缓冲区从 .NET 传递到 COM 并获取更新

    我有从 C 调用以下 COM 方法 该方法在提供的缓冲区中返回一个字符串pchText 这是not必须以零结尾 和复制的字符数pcch HRESULT Next in out long pcch out size is pcch OLECH
  • 使用 cURL 设计身份验证

    如何使用 Devise 从终端使用 cURL 验证我的 Ruby on Rails 应用程序 我想 curl user email password http domain bla api auth sign in 并正在回应 您要查找的页
  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • 标准在哪里谈论别名?

    C 标准中哪里谈到了别名 我查看了目录 没有看到 别名 这个词 我试图查看一个定义规则 3 2 但搜索 别名 没有结果 我不知道它可能在哪里 我正在寻找内存别名 别名主要在 3 10 basic lval 10中讨论 If a progra
  • 无法从 WebDriver 获取正确的控制台日志(Chrome、C#)

    我在 Selenium WebDriver C Chrome 浏览器中编写了以下微测试 它没有用 但这里不是这种情况 Test public void T2 API 001 PrintingAlerts pgactions OpenData
  • 为 Rails 3 应用程序制作自定义插件/gem/引擎

    我正在遵循指南http edgeguides rubyonrails org plugins html http edgeguides rubyonrails org plugins html而且它似乎有点过时了 您能看一下并告诉我哪些部分
  • 比较 .NET 中的两个字节数组

    我怎样才能快速做到这一点 当然我可以这样做 static bool ByteArrayCompare byte a1 byte a2 if a1 Length a2 Length return false for int i 0 i
  • 识别 Windows 版本

    我正在编写一个打印出详细 Windows 版本信息的函数 输出可能是这样的元组 32bit XP Professional SP3 English 它将支持 Windows XP 及更高版本 我一直坚持获取 Windows 版本 例如 专业
  • 使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

    我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法 在 Flask 中 g 对象可用于存储内容 并且可以将打开的数据库连接放置在那里 以允许应用程序在同一请求期间的后续数据库查询中重用它们 但是 g
  • 如何使用 NavigationStack 和 SwiftUI 发送额外数据?

    我有三个viewsA B 和 C 用户可以从 A 导航到 B 也可以从 A 导航到 C 用户可以从 B 导航到 C 现在我想区分用户是从 A 到 C 还是从 B 到 C 所以我在寻找如何在 NavigationStack 中传递额外的数据
  • 如何在mvc 4中使用多重选择?

    我想使用多重选择Chosen http harvesthq github com chosen 我有类似的技能模型 public class Skill public int Id get set public string Name ge
  • MySQL 中复制一条记录

    我有一个表 我想复制表中的特定行 我知道这不是最好的方法 但我们正在寻找快速解决方案 这比我最初想象的要难 我需要做的就是将整个记录复制到 MySql 中自动增量表中的新记录 而不需要指定每个字段 这是因为该表将来可能会发生变化 并且可能会
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 在 r 中使用 reprex 包创建可重现的示例,其中正在读取本地文件

    我经常使用reprex reprex创建可重复的示例R代码以获得其他人的帮助以消除我的代码中的错误 通常 我使用数据集创建最小的示例 例如iris or mtcars而且效果很好 但我总是无法使用reprex任何时候我需要使用我的own数据
  • NestJS 无法解析 UsersModule 的依赖关系

    NestJS 无法解析 UsersModule 的依赖关系 错误 错误 Nest 无法解析 UsersModule 的依赖关系 请 验证 0 参数在当前上下文中是否可用 应用程序模块 ts Module imports ConfigModu
  • 从 SQL Server 中调用 Python 文件

    我的文件名中有 Python 脚本 C Python HL py 在此 Python 脚本中 有预测模型以及对 SQL 数据库中某些表的更新 我想将此文件称为 SQL 作业 我怎样才能做到这一点 这个问题不一样 如何在 SQL Server
  • 将泛型类转换为接口

    我在将泛型类转换为它正在实现的接口时遇到问题 我的代码是这样的 interface foo void foobar class bar foo public void foobar throw new NotImplementedExcep