C# 通用复制构造函数

2024-02-12

我有一个接口和两个实现该接口的类。这些类具有泛型类型。我想从一个类的实例克隆到另一个类的实例。

interface IFoo
{
    // stuff
}

class Foo<T> : IFoo
{
    // foo stuff
    // ifoo implementation
}

class Bar<T> : IFoo
{
    // bar stuff
    // ifoo implementation
}

我有一个 Foo,想要一个 Bar。 Bar 有一个复制构造函数,其参数为 IFoo。 我创建了一个扩展方法来实现克隆:

public static Bar<T> Clone<T>(this IFoo foo) 
{
    return new Bar<T>(foo);
}

调用该方法需要类型:

someFoo.Clone<T> ...

有没有办法通过修改扩展方法或任何其他方式在调用方法时省略声明类型,以允许实例仅传入而不关心其底层类型?

Update以下是如何使用它来更好地说明情况。

在一个方法中,我迭代一个集合并返回 IFoo 的枚举。在该方法中,我查看源集合的属性并确定 Foo 的类型。

IFoo foo = null;

string type = element.Attribute("Type").Value;
switch (type)
{
    case "int":
        foo = new Foo<int>();
        break;

    case "string":
        foo = new Foo<string>();
        break;

    // etc
}
// other stuff

yield return foo;

调用方法有一个List。后来我从这个列表中选择单独的项目来使用,此时我想要一个 Bar 而不是 Foo。从列表中选择时,实例的类型为 IFoo,因为它们只能看到“this IFoo foo”的扩展方法。我不想将 IFoo 转换为 Foo,这需要重新声明 T 的类型。我只想让 Foo 告诉 Bar 它是什么。这可能吗?


所以你一切都好,但你希望能够使用语法

someFoo.Clone()

代替

someFoo.Clone<int>()

您希望隐含 int 而不是必须显式地将其放在那里?

您无法在代码示例中执行此操作的原因是 IFoo 没有引用创建所需的泛型类型 TBar<T>.

我建议你确实需要另一个接口:IFoo<T>

如果你有这个,并且你的扩展方法如下所示:

public static Bar<T> Clone<T>(this IFoo<T> foo) 
{
    return new Bar<T>(foo);
}

那么你使用就没有问题了

IFoo<int> someFoo = new Foo<int>();
Bar<int> someBar = someFoo.Clone();

希望有帮助

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

C# 通用复制构造函数 的相关文章

  • 对静态成员变量的未定义引用

    我有一个有静态成员的类 它也是我的程序中其他几个类的基类 这是它的头文件 ifndef YARL OBJECT HPP define YARL OBJECT HPP namespace yarlObject class YarlObject
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 扔掉挥发物安全吗?

    大多数时候 我都是这样做的 class a public a i 100 OK delete int j Compiler happy But is it safe The following code will lead compilat
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list

随机推荐

  • 如何限制JComboBox中的可编辑文本?

    我的 jcombobox 中已经有这个 myjcombobox getEditor getEditorComponent addKeyListener new KeyAdapter Override public void keyTyped
  • 跳过列表——用过它们吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道这里是否有人用过跳过列表 http en wikipedia org wiki Skip list 它看起来具有与平衡二叉树大致相同的优
  • ArrayLiteralConvertible:只是一个普通的协议?

    尝试理解和欣赏 ArrayLiteralConvertible 的工作原理 struct Struct
  • ASP.NET MVC:ValidationAttribute 和本地化 ErrorMessage

    我有 ValidationAttribute 像 public class Username ValidationAttribute public override bool IsValid object value if value nu
  • 使用 TableCellEditor 时如何获取鼠标单击位置的组件?

    我用的是自定义的TableCellRenderer与多个JFormattedTextField在表格单元格中 我使用相同的组件TableCellEditor 现在我需要知道在什么方面JFormattedTextField用户单击 以及该字段
  • 对所有列实施 NGX 数据表过滤

    我一直试图让它工作但没有运气 我一直在参考这些资源来寻求帮助 http swimlane github io ngx datatable filter http swimlane github io ngx datatable filter
  • 通过电子邮件和 PHP 进行电子邮件验证?

    我在一些网站上看到 用户可以简单地向类似的网站发送一封空白电子邮件 电子邮件受保护 cdn cgi l email protection如果他们在获取验证电子邮件时遇到问题 请验证他们的电子邮件 我有一个使用 PHP MySQL 的网站 我
  • iOS:以 caf 以外的其他格式录制音频

    我正在从事录音工作 我可以在 caf 中录制音频 核心音频格式 现在我想录制声音 mp3 or amr 我尝试了很多谷歌但没有找到任何东西 我不确定我的以下步骤是否有效 编写该音频 caf文档目录的扩展名 从该文件读取数据 再次写入文件 m
  • Laravel:从多对多关系中进行条件选择

    我的帖子和主题有多对多的 Laravel 关系 帖子属于许多主题 主题属于许多帖子 我想获得帖子编号 gt 10 from 某个话题 以下代码将获取特定主题的所有帖子 topic Topic where id topic id gt get
  • 为什么没有 $(window).height();返回一个值,但是 $(document).height();做?

    我正在尝试使用 jQuery 来获取当前窗口高度 我打算用这个值设置一个变量 并在调整大小时更新该值 由于某种原因 window height 总是返回零 但是 document height 返回一个值 为什么会这样呢 为了简洁起见 代码
  • 按特定列选择不同的实体

    我有一个包含 4 列的表 id column a 和column b 我最初的查询基本上是 Session session initialize my hibernate session Criteria criteria session
  • Indy TIdTCPClient 接收文本

    我尝试在 idtcpclient 中接收文本 但它不起作用 这是我在计时器中使用的代码 procedure TForm1 Timer2Timer Sender TObject var receivedtext string begin if
  • Magento:从没有产品的属性集中获取属性

    我在 Magento 商店中设置了一个属性集 其中有几个二进制属性 对于下拉列表 我需要此属性集中所有属性的列表 包括它们的内部名称和标签 由于此下拉列表应该出现在不一定选择产品的地方 因此我不能走 获取产品属性 的通常路线 我如何获取集合
  • 如何设置 Job DSL 创建的多分支作业的发现模式

    我是詹金斯的新手 我正在尝试解决一些问题 有没有办法通过 Groovy 添加分支源行为 这是使用 Jenkins 分析 SonarQube 中的 GitHub 项目 I m creating a multi branch pipeline
  • elasticsearch 是非确定性的吗?

    由于elasticsearch计算分数的算法 每次执行查询时是否不会以相同的顺序返回相同的结果 或者是别的什么 有没有办法让每次执行查询时结果都以相同的顺序返回 这是正常的吗 这可能与 elasticsearch 默认在本地计算相关性分数的
  • 如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?

    我有一个StackPanel含有一个StackPanel和其他一些物品 首先StackPanel具有垂直方向 内部具有水平方向 里面有一个TreeView and a ListView 我希望它们能够扩展并适应窗口的宽度 这是我通过窗口设置
  • 使用 TimeTCPClient 从公共时间服务器获取时间

    我尝试使用以下代码从公共时间服务器获取时间 package aaa import java util Arrays import java util List import org apache commons net TimeTCPCli
  • list.files 的性能问题

    我正在尝试使用以下命令从 3 个网络驱动器检索文件list files这需要永远 当我使用时find在 shell 中 它会在不到 15 秒的时间内返回所有结果 system time jnk lt list files c Volumes
  • Expo 安全存储在玩笑测试中不可用

    这个问题具体是关于expo secure store and jest 目前 我在登录时使用 expo secure store 来存储我的 JWT 它在模拟器上运行时工作正常 但是在 Jest 测试中根本不起作用 令牌返回为undefin
  • C# 通用复制构造函数

    我有一个接口和两个实现该接口的类 这些类具有泛型类型 我想从一个类的实例克隆到另一个类的实例 interface IFoo stuff class Foo