迭代索引属性(反射)

2024-04-20

我想迭代只能通过反射访问的索引属性,

但是(我是在充分了解可能有一个令人尴尬的简单答案的情况下才这么说的,MSDN/Google失败=/)除了在PropertyInfo.GetValue(prop, counter)直到TargetInvocationException被抛出。

ala:

foreach ( PropertyInfo prop in obj.GetType().GetProperties() )
{
    if ( prop.GetIndexParameters().Length > 0 )
    {
        // get an integer count value, by incrementing a counter until the exception is thrown
        int count = 0;
        while ( true )
        {
            try
            {
                prop.GetValue( obj, new object[] { count } );
                count++;
            }
            catch ( TargetInvocationException ) { break; }
        }

        for ( int i = 0; i < count; i++ )
        {
            // process the items value
            process( prop.GetValue( obj, new object[] { i } ) );
        }
    }
}

现在,这有一些问题......非常难看......解决方案......

例如,如果它是多维的或不按整数索引怎么办?

这是我用来尝试让它工作的测试代码(如果有人需要的话)。如果有人感兴趣,我正在制作一个自定义缓存系统,而 .Equals 并不能解决这个问题。

    static void Main()
    {
        object str = new String( ( "Hello, World" ).ToArray() );

        process( str );

        Console.ReadKey();
    }

    static void process( object obj )
    {
        Type type = obj.GetType();

        PropertyInfo[] properties = type.GetProperties();

        // if this obj has sub properties, apply this process to those rather than this.
        if ( properties.Length > 0 )
        {
            foreach ( PropertyInfo prop in properties )
            {
                // if it's an indexed type, run for each
                if ( prop.GetIndexParameters().Length > 0 )
                {
                    // get an integer count value
                    // issues, what if it's not an integer index (Dictionary?), what if it's multi-dimensional?
                    // just need to be able to iterate through each value in the indexed property
                    int count = 0;
                    while ( true )
                    {
                        try
                        {
                            prop.GetValue( obj, new object[] { count } );
                            count++;
                        }
                        catch ( TargetInvocationException ) { break; }
                    }

                    for ( int i = 0; i < count; i++ )
                    {
                        process( prop.GetValue( obj, new object[] { i } ) );
                    }
                }
                else
                {
                    // is normal type so.
                    process( prop.GetValue( obj, null ) );
                }
            }
        }
        else
        {
            // process to be applied to each property
            Console.WriteLine( "Property Value: {0}", obj.ToString() );
        }
    }

索引器的 getter 与普通方法一样,只是它使用方括号,而不是圆括号。您不会期望能够自动确定方法的可接受值的范围,因此这对于索引器来说是不可行的。

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

迭代索引属性(反射) 的相关文章

  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 如何更改sqlite中的数据库名称?

    我必须简单地更改数据库名称 但似乎ALTER DATABASE命令在 SQLite 中无效 我的场景是我有一个 SQLite 加密数据库 现在我想重命名它 手动重命名 db 文件后 加密不起作用 所以我尝试使用命令更改数据库的名称 看起来问
  • 如何修复错误:spawnSync powershell.exe ENOENT

    我想使用以下命令通过提升的 PowerShell 控制台安装 Windows 构建工具 npm install global production windows build tools 但每次运行时我都会收到以下错误npm install
  • 如何解决这个java.lang.RuntimeException?

    Google 开发者控制台显示我的应用程序在过去一个月中收到了两个相同的错误 但是这个RuntimeException没有指定错误源自的类或文件 我看不出什么具体的东西 以下是两种不同设备的错误 三星 Galaxy S8 Active cr
  • 在反应本机地图上显示用户位置

    如何在 React Native 地图上显示用户位置
  • 如何以编程方式更改 log4j2 中的 AppenderRef Level?

    我怎样才能改变AppenderRef Level在 log4j2 中 有一个堆栈溢出问题 https stackoverflow com questions 41427352 带答案 这是通过非编程方式解决的 我想要相同的但以编程方式代替
  • Google App Engine 是否识别并使用 .htaccess 文件?

    我正在使用 Google App Engine Launcher 在本地测试我的应用程序localhost 8080 我猜 Google App Engine Launcher 使用 Python 在本地运行服务器 但我读过 htacces
  • 如何将 ChromeDriver 包含在 JAR 中?

    我正在编写一个网络自动化程序 到目前为止 它使用 Selenium 的 FirefoxDriver 运行良好 但是 如果未安装 Firefox 我想让它使用 Chrome 我下载了 ChromeDriver 将其放入 Eclipse 项目的
  • 如何在android中录制视频的同时在视频上绘图,并保存视频和绘图?

    我正在尝试开发一款应用程序 允许我在录制视频时在视频上绘图 然后将录制内容和视频保存在一个 mp4 文件中以供以后使用 另外 我想使用camera2库 特别是我需要我的应用程序在高于API 21的设备上运行 并且我总是避免使用已弃用的库 我
  • 在 WPF 应用程序中绑定可为 null 的日期时间

    我有一个 wpf 应用程序 其中我有这个属性绑定到日期选择器 public Nullable
  • Swift 4 编程三引号

    当他们说 它与结束引用的缩进匹配时 是什么意思 对于占用多行的字符串 请使用三个双引号 只要与结束引号的缩进相匹配 每个带引号的行开头的缩进就会被删除 例如 让引号 虽然左边有空格 实际的行没有缩进 除了这一行 双引号 可以出现而无需转义
  • 查找图像列表的中值

    如果我有一个由 3D ndarray 表示的图像列表 例如 x y color 我可以使用哪些操作来输出具有所有值中值的图像 我正在使用 for 循环 发现它太慢了 这是我使用的矢量化实现NumPy http www numpy org 在
  • 如何在带有流星的车把助手中使用多个参数?

    我正在尝试使用 Meteor 创建一个自定义助手 以下是此处的文档 https github com meteor meteor wiki Handlebars https github com meteor meteor wiki Han
  • UIButton 和外观 API - 支持与否?

    根据UIAppearance协议参考 http developer apple com library ios documentation UIKit Reference UIAppearance Protocol Reference Re
  • GCF 部署失败(区域/计费)

    我无法再部署功能 即使在其他项目上也是如此 我一如既往地部署gcloud functions deploy 现在我收到这个错误 Failed to initialize region action ID 5a9a2fb704b2df80 E
  • 在 Rails 5 应用程序记录类中包含一个模块

    我正在使用应用程序记录来简化整个应用程序的共享逻辑 下面是一个编写布尔值及其逆的范围的示例 这效果很好 class ApplicationRecord lt ActiveRecord Base self abstract class tru
  • 根据条件替换数据框中的行

    我有以下数据框 id f1 f2 1 a 1 3 2 b 3 5 3 c 4 7 我想用一行替换 f1 gt 3 的所有行 id x f1 0 f2 0 所以上面的内容会映射到 id f1 f2 1 a 1 3 2 b 3 5 3 x 0
  • C# 的 switch 语句区分大小写。有没有办法切换它,使其不区分大小写? [复制]

    这个问题在这里已经有答案了 C 的 switch 语句区分大小写 有没有办法切换它 使其不区分大小写 谢谢 但是 我不喜欢这些解决方案 因为 case 条件将是一个变量 并且我不知道它们是否都是 UPPER 或 lower 是的 使用ToL
  • 如何在交叉验证和GridSearchCV中实现SMOTE

    我对 Python 比较陌生 您能帮助我将 SMOTE 的实施改进为适当的管道吗 我想要的是在每次 k 次迭代的训练集上应用过采样和欠采样 以便模型在平衡的数据集上进行训练 并在不平衡的遗漏部分上进行评估 问题是 当我这样做时 我无法使用熟
  • 如何使 json 数据可用于我的 Vue 动态路由

    我有一个List我从中获取日期的组件db blogs json created fetch http localhost 3000 blogs then response gt return response json then data
  • 迭代索引属性(反射)

    我想迭代只能通过反射访问的索引属性 但是 我是在充分了解可能有一个令人尴尬的简单答案的情况下才这么说的 MSDN Google失败 除了在PropertyInfo GetValue prop counter 直到TargetInvocati