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

c# – 使用反射设置对象的所有bool成员,第1张

概述我有一个结构,有很多名为bool的成员. (请为此示例留下良好做法,现在不考虑这些做法). 我想将这些值随机设置为true或false,仅用于测试目的. 我怎么能通过反思来做到这一点? 这是我到目前为止: Random r = new Random(); foreach (var bool_field in state.GetType().GetFields().Where(x = 我有一个结构,有很多名为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更改为类的情况下实现此目的?

解决方法 首先,您需要更改Where子句:
x => x.FIEldType == false.GetType()

由于x的类型是FIEldInfo

自上次OP编辑以来,它不是字段,而是属性.因此,您应该使用GetProperties来获取属性列表,并比较PropertyType,因为x将是PropertyInfo. 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的所有公共字段.在您的情况下,您需要私有的,所以使用Type.GetFields Method (BindingFlags)与合适的BindingFlags.

总结

以上是内存溢出为你收集整理的c# – 使用反射设置对象的所有bool成员全部内容,希望文章能够帮你解决c# – 使用反射设置对象的所有bool成员所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1250796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存