리플렉션을 사용하여 유형의 상수 검색
주어진 유형 내에서 선언된 모든 상수를 얻으려면 리플렉션을 사용할 수 있습니다. 다음 기술은 이 문제에 대한 해결책을 제공합니다.
기존 접근 방식에는 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 && !fi.IsInitOnly).ToList(); }
이 방법은 상수를 필터링하는 깔끔하고 간결한 방법을 제공합니다.
또는 한 줄 솔루션은 다음과 같습니다. 가능:
type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
이 접근 방식은 모든 필터링 작업을 단일 표현식으로 결합합니다.
위 내용은 C#에서 리플렉션을 사용하여 유형의 모든 상수를 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!