是否可以在 C# 中使用非类型化泛型列表?

2023-12-27

我正在尝试以下设计但没有成功:

abstract class Foo<T>
{
    abstract T Output { get; }
}

class Bar
{
    List<Foo> Foos;
}

我不喜欢使用数组列表,因为我必须使用不安全的强制转换来获取类型。我希望键入 Foo ,以便“输​​出”不仅仅是一个对象,在这种情况下,我还必须使用不安全的强制转换。

正如我目前的代码一样,我使用 Foo untyped 并将 Output 作为对象。


如果我理解正确的话,你想要一份清单Foo具有不同类型的对象Output是吧?由于这些输出具有不同的类型,因此无论如何您都必须在此处使用强制转换。

但是,以下想法可能会有所帮助。您声明一个名为的非泛型接口怎么样?IFoo: ¹

public interface IFoo
{
    object Output { get; }
}

然后在你的抽象类中实现它:

abstract class Foo<T> : IFoo
{
    abstract T Output { get; }
    object IFoo.Output { get { return Output; } }
}

然后你可以声明一个列表IFoos:

class Bar
{
    List<IFoo> Foos;
}

访问食物时,您可以通过接口将输出检索为对象:

var myObject = Foos[0].Output;     // type ‘object’

或者,如果您知道它只能是几种特定类型之一,则可以尝试发现真实类型:

if (Foos[0] is Foo<string>)
    var myString = ((Foo<string>) Foos[0]).Output;   // type ‘string’

您甚至可以根据类型进行过滤,例如:

// Type ‘IEnumerable<string>’ (rather than ‘IEnumerable<object>’)!
var stringFoos = Foos.OfType<Foo<string>>().Select(f => f.Output);

¹ You can also make this an abstract base class called Foo and have Foo<T> derive from it. In that case, you would need to mark Foo<T>.Output with the new keyword and use base.Output to access the abstract base member.

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

是否可以在 C# 中使用非类型化泛型列表? 的相关文章

随机推荐

  • 发送和接收短信

    我正在寻找如何使用自己的应用程序接收和发送短信的信息 我不知道我应该使用什么设备 什么编程语言有合适的API等等 您可能想调查一下Twilio http www twilio com 他们提供发送和接收短信的服务
  • Kivy:如何使小部件表现得像溢出:隐藏

    我想在 Kivy 中创建 GridLayout 其中包含许多矩形按钮以及一些不同大小的自定义图像 为此 我想要缩放图像 我想要执行此操作的方式如下所示 然后裁剪 隐藏溢出小部件边框的部分 调整大小效果很好 但我不知道如何隐藏 裁剪矩形之外的
  • 条件/三元运算符如何工作? C++ [重复]

    这个问题在这里已经有答案了 以下代码的直译是什么 另外 请解释它的含义以及使用该运算符的不同方法 int i 1 j 2 cout lt lt i gt j i j lt lt is greater lt lt endl 有关三元运算符的任
  • 机器的.net核心cpu使用率

    我最近从 c 迁移到 net core 在 C 中 我使用以下方法获取 CPU 使用情况 PerformanceCounter cpuCounter PerformanceCounter ramCounter cpuCounter new
  • 全新安装后,Stenciljs 从 @types/babel__traverse 包抛出构建错误

    So for context I have just installed stencil And was wanting to mess around with it I m using latest version from the do
  • Quill JS - 检查表单提交上的文本是否更改

    我正在使用 Quill 富文本 需要找到一种方法来检查页面提交表单时文本是否已更改 我对使用 Quill 还很陌生 并且一直在查看事件here https quilljs com docs api events html 每次文本更改时 显
  • 循环遍历数组的数组

    我有一个数组的数组 比如图形 如何迭代所有数组 var parentArray 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 它只是一个示例数
  • Django:部署服务器上未显示静态文件

    我无法让我的网站正确加载静态文件 关于静态文件的settings py文件如下 Static files STATIC URL static STATIC ROOT var www str8red com static STATICFILE
  • 有资质的生产者消费者

    我是 clojure 的新手 正在尝试了解如何正确使用其并发功能 因此任何批评 建议都会受到赞赏 所以我尝试在 clojure 中编写一个小型测试程序 其工作原理如下 有 5 个生产者和 2 个消费者 生产者等待一段随机时间 然后将一个数字
  • 克服空数组的 ValueError

    In 这次讨论 https stackoverflow com questions 22853118 twiny in matplotlib changes the y axis scale 22856984 noredirect 1 co
  • 如何删除cllocation的缓存?

    我正在开发一个 iPhone 应用程序 它是一个位置感知应用程序 目前 除了先前位置的缓存之外 该应用程序运行良好 第一次启动应用程序位置管理器会获取当前位置 然后根据当前位置显示附近的事物 但从下一个开始 它会使用之前获取的位置 直到我重
  • 在 php 中解析 mIRC 颜色

    我想转换mirc 颜色代码 http www mirc com help colors html通过 php 转换为 html 这是示例 http searchirc com search php F exact T chan N 6246
  • Javascript异步执行:回调会中断正在运行的代码吗?

    我只是希望有人能为我澄清这一点 如果我使用 Node js 在服务器端运行以下代码 不在浏览器中 console log a db get select from table1 function result console log b c
  • 如何在WebBrowser控件中注入CSS?

    据我所知 有一种方法可以将 javascript 注入到 DOM 中 下面是使用 javascript 注入的示例代码webbrowser控制 HtmlElement head webBrowser1 Document GetElement
  • 在 HTML/JavaScript 扩展中使用 x-webkit-speech

    我正在尝试使用新的x webkit speech简单 HTML JavaScript 扩展中的函数谷歌浏览器 http en wikipedia org wiki Google Chrome 然而 我已经尝试并尝试查看一堆示例 但无法让它成
  • Number 上的 QueryDSL Like 操作

    我必须用通配符搜索数字字段 相应的 JQPL 查询将如下所示 SELECT e From Entity e where e personNumber LIKE numberPattern numberPattern 是一个像这样的字符串 1
  • Git-svn 可以在大型分支存储库上使用吗?

    我正在尝试使用 Git 作为 SVN 存储库的前端 以便能够使用 Git 的优秀功能 例如简单的分支 存储等 问题是 SVN 存储库非常大 8 000 转 并且包含大量分支和标签 旧的和新的 这是一个接近标准的布局 配置包含获取 分支和标签
  • AngularJS 返回 Object 对象

    我有一个返回数组的后端 REST 服务 我正在尝试在我的其中之一中显示此 REST 服务返回的值
  • 改进快速排序

    如果可能 我如何改进以下快速排序 性能方面 有什么建议么 void main quick a 0 n 1 void quick int a int lower int upper int loc if lower
  • 是否可以在 C# 中使用非类型化泛型列表?

    我正在尝试以下设计但没有成功 abstract class Foo