¿Cómo puedo obtener todas las constantes de cualquier tipo mediante el reflejo?¿Cómo puedo obtener todas las constantes de un tipo por reflexión?
Respuesta
Aunque se trata de un código antiguo:
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 determine 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));
}
usted puede convertir fácilmente a más limpias que utilizan los genéricos de código y 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();
}
O con una línea:
type.GetFields(BindingFlags.Public | BindingFlags.Static |
BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
* Mi + 1 * era incluso antes de pasar por la segunda línea ... noté que estás atravesando cada paso con su ... propósito previsto por diseño ...! esto es ** SO ** importante cuando uno necesita aprender de ello. quisiera que cada uno con tu experiencia hiciera lo que hiciste aquí. – LoneXcoder
No estoy seguro acerca de las afirmaciones con respecto a IsLiteral e IsInitOnly. En las pruebas parecería que para las propiedades estáticas de solo lectura IsLiteral siempre es falso, por lo que IsLiteral es el único indicador que debe verificar para encontrar las constantes y puede ignorar IsInitOnly. Intenté con diferentes tipos de campos (por ejemplo, String, Int32) para ver si esto hacía alguna diferencia, pero no fue así. –
Además, para obtener el valor de const de FieldInfo, use GetRawConstantValue(). –
uso property.GetConstantValue() para obtener el valor
Ese puede ser el caso cuando * tiene * la propiedad, pero * ¿cómo * obtiene primero la propiedad? –
En .Net 4.5 es: 'GetRawConstantValue()' – Chris
Como extensiones Tipo:
public static class TypeExtensions
{
public static IEnumerable<FieldInfo> GetConstants(this Type type)
{
var fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
return fieldInfos.Where(fi => fi.IsLiteral && !fi.IsInitOnly);
}
public static IEnumerable<T> GetConstantsValues<T>(this Type type) where T : class
{
var fieldInfos = GetConstants(type);
return fieldInfos.Select(fi => fi.GetRawConstantValue() as T);
}
}
Obviamente, esto es si sus constantes en un tipo son todas las cadenas ;-) – nashwan
¿Por qué no (a) hacer los métodos genéricos, (b) hacer que los métodos devuelvan 'IEnumerable
@WaiHaLee - Hecho :-). Aunque obviamente asume que todos los tipos de constelaciones en la clase en cuestión son de tipo T. – nashwan
Si desea obtener los valores de todas las constantes de un tipo específico, desde el tipo de destino, aquí es un método de extensión (que se extiende algunas de las respuestas en esta página):
public static class TypeUtilities
{
public static List<T> GetAllPublicConstantValues<T>(this Type type)
{
return type
.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.FieldType == typeof(T))
.Select(x => (T)x.GetRawConstantValue())
.ToList();
}
}
Entonces, para una clase como esta
static class MyFruitKeys
{
public const string Apple = "apple";
public const string Plum = "plum";
public const string Peach = "peach";
public const int WillNotBeIncluded = -1;
}
puede obtener el string
valores constantes como esto:
List<string> result = typeof(MyFruitKeys).GetAllPublicConstantValues<string>();
//result[0] == "apple"
//result[1] == "plum"
//result[2] == "peach"
- 1. Obteniendo todas las clases internas por reflexión
- 2. Uso de la reflexión para obtener todas las clases de cierto tipo base en dll
- 3. Obtener todas las propiedades con los valores de reflexión
- 4. Obtener las propiedades de un tipo dinámico
- 5. C#: Cómo obtener todas las propiedades de cadena públicas (tanto obtener y establecer) de un tipo
- 6. ¿Cómo puedo obtener un tipo de un conjunto referenciado a través de la reflexión
- 7. ¿Cómo obtengo las constantes definidas por la clase de Ruby's Module mediante reflexión?
- 8. ¿Cómo puedo obtener todas las imágenes de un archivo qrc?
- 9. ¿Por qué puedo cambiar las constantes?
- 10. C# - ¿son todas las constantes de Enum?
- 11. ¿Cómo puedo obtener la definición de texto correcta de un tipo genérico utilizando la reflexión?
- 12. Reflexión: Cómo obtener el tipo subyacente de un tipo de ref.
- 13. Obtener el tipo de un campo en Haxe (reflexión API)
- 14. C# reflexión y búsqueda de todas las referencias
- 15. ¿Cómo obtener todas las propiedades estáticas y sus valores de una clase que utilizan la reflexión
- 16. ¿Cómo puedo inyectar un UITypeEditor personalizado para todas las propiedades de un tipo de fuente cerrada?
- 17. Cómo encontrar un método sobrecargado por reflexión
- 18. ¿Cómo puedo obtener todas las unidades USB (conectado)
- 19. Para un objeto, ¿puedo obtener todas sus subclases usando reflexión u otras formas?
- 20. Delphi: ¿Todas las constantes son constantes, pero algunas son más constantes que otras?
- 21. ¿Cómo puedo obtener todas las letras alpabéticas en PHP?
- 22. Obtener el tipo de contenedor para un tipo anidado utilizando la reflexión
- 23. Reflexión: ¿Cómo obtener un método genérico?
- 24. Cómo definir adecuadamente las constantes
- 25. ¿Cómo puedo obtener la lista de todas las acciones de MVC Controller al pasar ControllerName?
- 26. Las ventajas de las constantes
- 27. Clase de reflexión para obtener todas las propiedades de cualquier objeto
- 28. Cómo obtener todas las casillas marcadas
- 29. ¿Cómo obtener todas las coincidencias de regex?
- 30. ¿Cómo puedo listar TODAS las concesiones que recibió un usuario?
http://weblogs.asp.net/whaggard/archive/2003/02/20/2708.aspx –