Dado un objeto PropertyInfo, ¿cómo puedo verificar que el colocador de la propiedad sea público?Cómo comprobar si el configurador de propiedades es público
Respuesta
Comprobar lo que se obtiene de vuelta de GetSetMethod
:
MethodInfo setMethod = propInfo.GetSetMethod();
if (setMethod == null)
{
// The setter doesn't exist or isn't public.
}
O, para decirlo de un giro diferente en Richard's answer:
if (propInfo.CanWrite && propInfo.GetSetMethod(/*nonPublic*/ true).IsPublic)
{
// The setter exists and is public.
}
Nota que si todo lo que quieres hacer es establecer una propiedad siempre que tenga un setter, no realizas y tiene que importarle si el colocador es público. Que sólo puede usarlo, pública o privada:
// This will give you the setter, whatever its accessibility,
// assuming it exists.
MethodInfo setter = propInfo.GetSetMethod(/*nonPublic*/ true);
if (setter != null)
{
// Just be aware that you're kind of being sneaky here.
setter.Invoke(target, new object[] { value });
}
. Las propiedades .NET son realmente una envoltura alrededor de un método get y set.
Puede utilizar el método GetSetMethod
en PropertyInfo, devolviendo la MethodInfo referente al setter. Puede hacer lo mismo con GetGetMethod
.
Estos métodos devolverán nulo si el getter/setter no es público.
El código correcto en este caso es:
bool IsPublic = propertyInfo.GetSetMethod() != null;
public class Program
{
class Foo
{
public string Bar { get; private set; }
}
static void Main(string[] args)
{
var prop = typeof(Foo).GetProperty("Bar");
if (prop != null)
{
// The property exists
var setter = prop.GetSetMethod(true);
if (setter != null)
{
// There's a setter
Console.WriteLine(setter.IsPublic);
}
}
}
}
Es necesario utilizar el método subordinado para determinar la accesibilidad, el uso o PropertyInfo.GetGetMethod()PropertyInfo.GetSetMethod().
// Get a PropertyInfo instance...
var info = typeof(string).GetProperty ("Length");
// Then use the get method or the set method to determine accessibility
var isPublic = (info.GetGetMethod(true) ?? info.GetSetMethod(true)).IsPublic;
Nótese, sin embargo, que el colocador captador & puede tener diferentes accesibilidades, por ejemplo .:
class Demo {
public string Foo {/* public/* get; protected set; }
}
Así que no se puede asumir que el comprador y el colocador tendrán la misma visibilidad.
- 1. comprobar mediante programación si el método es público
- 2. ¿Cómo comprobar si el archivo es binario?
- 3. Cómo comprobar si el GUID es cero
- 4. ¿cómo público es un repositorio público github?
- 5. Comprobar si es falso
- 6. ¿Cómo comprobar si el elemento no es el primer hijo?
- 7. ¿Cómo comprobar si un doble es nulo?
- 8. cómo comprobar si java.lang.reflect.Type es una enumeración
- 9. Cómo comprobar si request.GET var es None?
- 10. Cómo comprobar si JSONArray Element es nulo
- 11. ¿Cómo comprobar si un puntero es válido?
- 12. ¿Cómo comprobar si es sábado/domingo?
- 13. ¿Cómo comprobar si una propiedad es virtual con reflejo?
- 14. Comprobar si boolean es verdadero
- 15. Cómo verificar si IP es un proxy público
- 16. ¿Cómo puedo comprobar si el día actual es día laborable
- 17. Cómo comprobar si mi aplicación es el iniciador predeterminado
- 18. Cómo comprobar si el carácter es utf-8
- 19. ¿Cómo comprobar si el navegador es compatible con HTML5?
- 20. ¿Cómo comprobar si el sistema operativo es Vista en Python?
- 21. cómo comprobar si el carácter es un número entero
- 22. ¿Cómo comprobar si el objeto es un elemento DOM?
- 23. ¿Cómo comprobar si un tipo es una cadena en C#?
- 24. cómo comprobar si IsNumeric
- 25. Tratando de comprobar si urlreferrer es nulo
- 26. Comprobar si el descriptor de archivo es válido
- 27. ¿Cómo comprobar si el proceso no responde?
- 28. ¿Cómo comprobar si el descifrado fue exitoso?
- 29. Comprobar si un archivo es una imagen
- 30. cómo comprobar si el objeto ya existe en una lista
+1: Esto es mejor que 'GetSetMethod(). IsPublic' : también funciona cuando la propiedad tiene * no * setter. – Ani
Gracias @Dan Tao. Esta es la mejor respuesta: ¡votado! –
Gracias @Dan Tao. :) –