>백엔드 개발 >C++ >C#에서 리플렉션을 사용하여 유형의 모든 상수를 검색하려면 어떻게 해야 합니까?

C#에서 리플렉션을 사용하여 유형의 모든 상수를 검색하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-03 19:38:41360검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.