Entonces en mi caso estoy descubriendo la estructura de una clase usando la reflexión. Necesito poder averiguar si una propiedad es una propiedad implementada automáticamente por el objeto PropertyInfo. Supongo que la API de reflexión no expone dicha funcionalidad porque las auto-propiedades dependen de C#, pero ¿hay alguna solución para obtener esta información?¿Cómo saber si una propiedad es una propiedad implementada automáticamente con reflexión?
18
A
Respuesta
16
Puede verificar si el método get
o set
está marcado con el atributo CompilerGenerated
. A continuación, puede combinar eso con la búsqueda de un campo privado marcado con el atributo CompilerGenerated
que contiene el nombre de la propiedad y la cadena "BackingField"
.
Tal vez:
public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
this PropertyInfo info
) {
bool mightBe = info.GetGetMethod()
.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
)
.Any();
if (!mightBe) {
return false;
}
bool maybe = info.DeclaringType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.Name.Contains(info.Name))
.Where(f => f.Name.Contains("BackingField"))
.Where(
f => f.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
).Any()
)
.Any();
return maybe;
}
No es a toda prueba, bastante frágil y probablemente no portátil para, por ejemplo, Mono.
7
Esto debería hacer:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
La razón es que para la auto-properties la propiedad Name
del respaldo FieldInfo
se vería así:
<PropertName>k__BackingField
Desde caracteres <
y >
no aparecería para los campos normales, un campo con ese tipo de nomenclatura apunta a un campo de respaldo de una propiedad automática. Como dice Jason, todavía es frágil.
O para que sea un poco más rápido,
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
Cuestiones relacionadas
- 1. ¿Cómo puedo saber si una propiedad es una colección genérica?
- 2. cómo saber si una propiedad existe y es falsa
- 3. iOS: ¿Cómo puedo saber si una propiedad cumple con KVO?
- 4. ¿Cómo comprobar si una propiedad es virtual con reflejo?
- 5. Objeto dinámico: cómo saber si una propiedad está definida?
- 6. Averiguar si una propiedad es declarada virtual
- 7. ¿Cómo puedo saber si necesito conservar o asignar una propiedad?
- 8. ¿Cómo puedo acceder a la variable de respaldo de una propiedad implementada automáticamente?
- 9. ¿Por qué debería usar una propiedad implementada automáticamente en lugar de un campo?
- 10. Establecer una propiedad por reflexión con un valor de cadena
- 11. .NET de Reflexión propiedad privada
- 12. ¿Dónde/cuál es la variable privada en la propiedad implementada automáticamente?
- 13. Determinar si una propiedad es un tipo de matriz por reflexión
- 14. ¿Cómo verificar si existe una propiedad?
- 15. En C#, ¿cómo puedo saber si una propiedad es estática? (.Net CF 2.0)
- 16. ¿Es posible la propiedad de solo lectura y auto implementada?
- 17. cómo saber si una variable de JavaScript es una función
- 18. iteración a través de una propiedad indexada (Reflexión)
- 19. Modificadores de reflexión y acceso en una propiedad
- 20. ¿Cómo ver si una clase tiene una propiedad?
- 21. Cómo configurar una propiedad Ant solo si no está configurada
- 22. ¿Cómo puedo obtener Castle Windsor para inyectar automáticamente una propiedad?
- 23. Determinar si una propiedad de objeto es ko.observable
- 24. ¿Cómo codigo una propiedad con sub-propiedades?
- 25. prueba si se define una propiedad MSBuild?
- 26. ¿Puedo decir si una propiedad está sucia usando nhibernate?
- 27. Cómo detectar si una propiedad del Sistema Java ha cambiado?
- 28. Detectar si una propiedad de objeto es privada en PHP
- 29. Prueba Si una propiedad no es nulo antes de regresar
- 30. Enlazando a una segunda propiedad si la primera es "indefinida"
Muchas gracias Jason, el reflector me dijo lo mismo en el ínterin :) Debería haber pensado en ello antes. – Zoki
@ 3o4eTo: Solo tenga en cuenta que esto no es a prueba de tontos, quebradizo y posiblemente no portátil para Mono. – jason
También cuide la excepción cuando no hay captadores en la propiedad. – nawfal