如何查明对象的类型是否实现 IEnumerable,其中 X 使用反射从 Base 派生

2023-11-22

给一个基类Base,我想写一个方法Test,像这样:

private static bool Test(IEnumerable enumerable)
{
...
}

如果 o 的类型实现了任何接口,则 Test 返回 trueIEnumerable<X> where X源自于Base,所以如果我这样做:

public static IEnumerable<string> Convert(IEnumerable enumerable)
{
    if (Test(enumerable))
    {
        return enumerable.Cast<Base>().Select(b => b.SomePropertyThatIsString);
    }

    return enumerable.Cast<object>().Select(o => o.ToString());
}

...它会使用反射做正确的事情。我确信这是遍历该类型的所有接口以找到第一个符合要求的接口的问题,但我很难找到通用的IEnumerable<>他们之中。

当然,我可以这样考虑:

public static IEnumerable<string> Convert(IEnumerable enumerable)
{
    return enumerable.Cast<object>().Select(o => o is Base ? ((Base)o).SomePropertyThatIsString : o.ToString());
}

...但将其视为一个思想实验。


您还可以使用LINQ查询可能看起来像这样。

public static bool ImplementsBaseType(IEnumerable objects)
{
    int found = ( from i in objects.GetType().GetInterfaces()
                 where i.IsGenericType && 
                       i.GetGenericTypeDefinition() == typeof(IEnumerable<>) &&
                       typeof(MyBaseClass).IsAssignableFrom(i.GetGenericArguments()[0])
                 select i ).Count();

    return (found > 0);
}

此代码假定以下 using 语句:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

因为这只是一个思想实验。这是作为扩展方法的另一种实现。

public static class ConversionAssistants
{
    public static bool GenericImplementsType(this IEnumerable objects, Type baseType)
    {
        foreach (Type type in objects.GetType().GetInterfaces())
        {
            if (type.IsGenericType)
            {
                if (type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
                {
                    if (baseType.IsAssignableFrom(type.GetGenericArguments()[0]))
                        return true;
                }
            }
        }
        return false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查明对象的类型是否实现 IEnumerable,其中 X 使用反射从 Base 派生 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何使用 LINQ 获取唯一 id 列的最大值

    如何使用 LINQ 以最简单的方式编写此代码 SELECT MAX Game id AS MaxValue FROM Dim Game Try context Dim Games Max g gt g Game id
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • PowerShell 哈希表双键错误:“a”和“A”

    从另一个应用程序我有我想在我的脚本中使用的键值对 但他们有例如键 a 和 A 这会导致错误不允许使用双键 x a Entry for a A S th else for A 如果我两者都需要或都不需要 我该怎么办 提前致谢 Gooly 默认
  • 为什么在 C 语言中在堆栈上声明一个大数组时会出现段错误?

    我从这行代码中得到了一个段错误 int fatblob 1820 286 5 这是为什么 因为你的堆栈段较小1820 285 5 ints 通常在 1MB 左右
  • 对使用 Spring JDBC 的 DAO 类进行单元测试

    我有几个 DAO 对象 用于从数据库中检索信息 并且我really想为他们编写一些自动化测试 但我很难弄清楚如何去做 我正在使用Spring的JdbcTemplate运行实际查询 通过准备好的语句 并将结果映射到模型对象 通过RowMapp
  • 我可以使用 Liquibase 创建 Hibernate Envers 特定表吗

    我们的 Java 应用程序是基于 Spring 的 我们有域类和通过 Liquibase 生成的相应架构 我们计划添加对要审核的单个域的支持 A 我们没有 hibernate xml 和 hibernate cfg xml 而是使用 app
  • 如何在 UISplitViewController iPad 之前添加登录视图

    我想在我的应用程序中的 UISplitViewController 之前显示登录视图 我不知道如何做到这一点 因为 Apple 关于 iPad 的文档说 UISplitViewController 应该是应用程序的根视图控制器 使用模态视图
  • Laravel 5 WebPack JQuery - $ 未定义

    我有 webpack min js mix webpackConfig webpack gt return plugins new webpack ProvidePlugin jquery jQuery jquery window jQue
  • 如何用PHP实现真正快速的网络聊天?

    如何用PHP实现真正快速的网络聊天 有没有人想过为什么 Facebook 聊天速度这么快 即使在没有 WebSocket 的 IE 中也是如此 JS中的setInterval不是唯一的方法来检查新消息吗 但我觉得 Facebook 聊天框
  • 如何从 VBScript 获取程序文件环境设置

    在批处理文件中 您可以使用 PROGRAMFILES 来获取程序文件目录的位置 在VBScript中如何做到这一点 Set wshShell CreateObject WScript Shell WScript Echo wshShell
  • 如何找到 Cocoa 中剩余多少磁盘空间?

    我想我希望能够找到任何存储 而不仅仅是系统磁盘 但这是最重要的 Use NSFileManager attributesOfFileSystemForPath error
  • 使用显示内联块列向下移动

    我正在尝试使用display inline block建造3根柱子 一开始它工作得很好 但是当我将内容添加到第一列时 它会影响布局的其余部分 并将其余列呈现在较低的级别 我可以做什么来避免这种情况 cont width 500px heig
  • 可以在 ORDER BY 中添加 if 语句吗?

    我正在努力实现以下目标 我有一个 ORDER BY 语句 该语句可能会根据 A 列中存储的值而变化 例如 如果类型是成员 则按成员姓氏排序 如果类型是组 则按组名称排序 两者均按升序排列 我对最终声明的最佳猜测是 SELECT FROM t
  • 为什么 Go 中有数组?

    我了解 Go 中数组和切片之间的区别 但我不明白的是为什么数组有帮助 为什么数组类型定义指定长度和元素类型很有帮助 为什么我们使用的每个 数组 不能都是切片 还有更多arrays不仅仅是固定长度 它们是可比 他们是values 不是引用或指
  • scanf 不会要求第二次输入[重复]

    这个问题在这里已经有答案了 include stdio h int main void int order nextp N 3 char cont nextp 0 printf nShould we continue y or n scan
  • 在 iOS 中实例化后台运行循环

    Use Case 我有一组进程 每个进程都需要以一定的执行速率 每秒 3 次 每 10 秒一次等 在自己的后台线程上运行 I believe CFRunLoop and or NSRunLoop提供此功能 Question 如何 快速 创建
  • 在 Java 中标记中缀字符串

    我正在实施调车场算法Java 语言 作为我的 AP 计算机科学课程的一个副项目 我用 Javascript 实现了一个简单的 只有基本的算术表达式 加法 减法 乘法 除法 取幂 为了将其拆分为一个数组 我所做的就是找到每个运算符 以及数字和
  • 如何在 OS X Leopard 上安装 MySQL 和 Python MySQL 包?或者我如何学习如何成为一名使用 OS X 的 Web 开发人员?

    我是 Mac OS X 的新手 我正准备扔掉我的全新设备MacBook Pro窗外 有关设置 Django 开发环境的每个教程Mac OS X Leopard是阴险的错误 他们都跳过一个步骤 或者假设你已经以一种方式设置了某些东西 或者只是
  • 快速排序枢轴

    使用快速排序对以下数组 a 进行排序 6 11 4 9 8 2 5 8 13 7 主元应选择为第一个和最后一个元素的算术平均值 即 a 0 a size 1 2 rounded down 显示所有重要步骤 例如分区和算法的递归调用 我了解如
  • 在 Setter.Value 结构中设置事件处理程序

    我有一个ListView我想设置一个上下文菜单 我不仅可以在右键单击某些列中的某些文本时打开该菜单 而且可以在该列中的任何位置打开该菜单ListViewItem 为此我想我只需设置我的ContextMenu使用样式设置器 因为我无法直接访问
  • 如何在winform中使组框文本居中对齐?

    我正在使用一个组框 里面有几个控件 我的要求是将组框标题设置为组框的中间而不是左侧 How 您可以像这样扩展组框类 public class CustomGrpBox GroupBox private string Text public
  • 如何查明对象的类型是否实现 IEnumerable,其中 X 使用反射从 Base 派生

    给一个基类Base 我想写一个方法Test 像这样 private static bool Test IEnumerable enumerable 如果 o 的类型实现了任何接口 则 Test 返回 trueIEnumerable