【问题标题】:Loop all the constants in a class [duplicate]循环一个类中的所有常量[重复]
【发布时间】:2014-02-09 10:27:00
【问题描述】:

我想循环静态类中的所有常量变量。例如

public class SiteDetails
{
    public const string SD_MAIN_TRUST = "MainTrust";
    public const string SD_MAIN_COLLEGE = "MainCollege";
}

我想一一读取常量以检查是否匹配。

【问题讨论】:

标签: c# asp.net loops constants


【解决方案1】:

获取您类型的所有公共静态字段:

Type type = typeof(SiteDetails);
var flags = BindingFlags.Static | BindingFlags.Public;
var fields = type.GetFields(flags); // that will return all fields of any type

如果您只想检查常量,可以添加IsLiteral 过滤。

var fields = type.GetFields(flags).Where(f => f.IsLiteral);

然后检查任何字段的值是否等于您的值:

string value = "MainCollege"; // your value
bool match = fields.Any(f => value.Equals(f.GetValue(null)));

【讨论】:

  • Getfields() 没有返回常量。我想一一读取所有常量。
  • @Nathiya 我认为您没有尝试过我的代码。您有静态文字字段,应使用 GetFields() 方法读取
  • 我刚刚尝试过您的代码,它给出的字段为零。 var flags = BindingFlags.Static | BindingFlags.Public; var field1s = classType.GetFields(flags);
  • @Nathiya 刚刚验证 - 它给了我两个字段 SD_MAIN_TRUSTSD_MAIN_COLLEGE。确保您使用的代码与我提供的完全相同。还要确保您的真实班级名称为SiteDetails,并且它确实包含字段。
  • 现在我在包含 BindingFlags.Instance 后得到结果,我得到了结果。为了检查字段如何使用循环获取所有字段?
【解决方案2】:

您可以使用Linq枚举常量:

  foreach(FieldInfo info in typeof(SiteDetails).GetFields().Where(x => x.IsStatic && x.IsLiteral)) {
    // info is the constant description with
    // info.Name       - constant's name  (e.g. "SD_MAIN_TRUST")
    // info.GetValue() - constant's value (e.g. "MainTrust")
    ...
  }

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2010-12-02
    • 2016-03-26
    • 2010-11-26
    • 1970-01-01
    • 2020-12-26
    • 2019-07-28
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多