首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板