首页 > 后端开发 > C++ > 如何在 C# 中使用反射检索某个类型的所有常量?

如何在 C# 中使用反射检索某个类型的所有常量?

Susan Sarandon
发布: 2025-01-03 19:38:41
原创
323 人浏览过

How Can I Retrieve All Constants of a Type Using Reflection in C#?

使用反射检索类型的常量

要获取给定类型中声明的所有常量,可以使用反射。以下技术提供了此问题的解决方案:

传统方法涉及使用 GetFields() 方法检索该类型的字段。通过根据 IsLiteral 和 IsInitOnly 属性过滤掉非常量字段,可以隔离常量字段。下面是一个示例实现:

private FieldInfo[] GetConstants(System.Type type)
{
    ArrayList constants = new ArrayList();

    FieldInfo[] fieldInfos = type.GetFields(
        // Gets all public and static fields
        BindingFlags.Public | BindingFlags.Static | 
        // This tells it to get the fields from all base types as well
        BindingFlags.FlattenHierarchy);

    // Go through the list and only pick out the constants
    foreach(FieldInfo fi in fieldInfos)
        // IsLiteral determines if its value is written at 
        //   compile time and not changeable
        // IsInitOnly determines if the field can be set 
        //   in the body of the constructor
        // for C# a field which is readonly keyword would have both true 
        //   but a const field would have only IsLiteral equal to true
        if(fi.IsLiteral && !fi.IsInitOnly)
            constants.Add(fi);           

    // Return an array of FieldInfos
    return (FieldInfo[])constants.ToArray(typeof(FieldInfo));
}
登录后复制

为了更简洁的解决方案,可以利用泛型和 LINQ:

private List<FieldInfo> GetConstants(Type type)
{
    FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public |
         BindingFlags.Static | BindingFlags.FlattenHierarchy);

    return fieldInfos.Where(fi => fi.IsLiteral &amp;&amp; !fi.IsInitOnly).ToList();
}
登录后复制

此方法提供了一种干净简洁的方法来过滤常量。

或者,也可以使用单行解决方案:

type.GetFields(BindingFlags.Public | BindingFlags.Static |
               BindingFlags.FlattenHierarchy)
    .Where(fi => fi.IsLiteral &amp;&amp; !fi.IsInitOnly).ToList();
登录后复制

这方法将所有过滤操作合并到一个表达式中。

以上是如何在 C# 中使用反射检索某个类型的所有常量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板