使用反射设置对象的所有bool成员

 金色阳光CC 发布于 2023-02-10 02:18

我有一个结构,有很多名为bool的成员.(请为此示例留下良好做法,现在不考虑这些做法).

我想将这些值随机设置为true或false,仅用于测试目的.

我怎么能通过反思来做到这一点?

这是我到目前为止:

        Random r = new Random();
        foreach (var bool_field in state.GetType().GetFields().Where(x => x.GetType() == false.GetType()))
        {
            bool_field.SetValue(state, r.Next() % 2 == 0 ? true : false);
        }

不幸的是,它永远不会进入循环.

更新1:

以下是SystemState结构的外观,它是状态变量的类型.它充满了bool汽车属性.

public struct SystemState
{
     ...
     public bool CanYouHelpMeOnThisOne { get; set; }
     ...
}

更新2:

下面发布的解决方案似乎很好,但它不起作用.原因是SystemState是一个结构而不是一个类.因此,它是Value类型而不是Reference类型,因此调用SetValue方法无效.将SystemState更改为class后,以下解决方案完美运行.

现在有没有其他方法,在不将SystemState更改为类的情况下实现此目的?

1 个回答
  • 首先,您需要更改Where子句:

    x => x.FieldType == false.GetType()
    

    为一体的类型x就是FieldInfo


    自上次OP编辑以来,它不是字段,而是属性.所以,你应该用GetProperties得到的属性列表,并比较PropertyType,因为xPropertyInfo呢.该SetValue方法也将具有其他签名.

     foreach (var bool_field in state.GetType()
                                     .GetProperties()
                                     .Where(x => x.PropertyType == false.GetType()))
     {
         bool_field.SetValue(state, r.Next() % 2 == 0 ? true : false, null);
     }
    

    根据OP的注释,如果您确实想要访问支持字段,可以使用以下代码:

    var fs = state.GetType()
                  .GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
                  .Where(x => x.FieldType == typeof(bool));
    foreach (var f in fs)
    {
        f.SetValue(state, true);
    }
    

    GetFields不带参数的重载会返回当前Type的所有公共字段.虽然在你的情况下你需要private那些,所以使用Type.GetFields方法(BindingFlags)和合适的BindingFlags.

    2023-02-10 02:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有