Étant donné un objet PropertyInfo, comment puis-je vérifier que le setter de la propriété est public?
Vérifiez ce que vous obtenez de GetSetMethod
:
MethodInfo setMethod = propInfo.GetSetMethod();
if (setMethod == null)
{
// The setter doesn't exist or isn't public.
}
Ou, pour donner une tournure différente à réponse de Richard :
if (propInfo.CanWrite && propInfo.GetSetMethod(/*nonPublic*/ true).IsPublic)
{
// The setter exists and is public.
}
Notez que si tout ce que vous voulez faire est de définir une propriété tant qu'elle a un setter, vous n'avez pas à vous soucier si le setter est public. Vous pouvez simplement l'utiliser, public ou privé:
// 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 });
}
Les propriétés .NET sont vraiment un enveloppement Shell autour d'une méthode get and set.
Vous pouvez utiliser la méthode GetSetMethod
sur le PropertyInfo, renvoyant le MethodInfo en référence au setter. Vous pouvez faire la même chose avec GetGetMethod
.
Ces méthodes renverront null si le getter/setter n'est pas public.
Le code correct ici est:
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);
}
}
}
}
Vous devez utiliser la méthode de soulignement pour déterminer l'accessibilité, en utilisant PropertyInfo.GetGetMethod () ou 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;
Notez cependant que le getter et le setter peuvent avoir différentes accessibilités, par exemple:
class Demo {
public string Foo {/* public/* get; protected set; }
}
Vous ne pouvez donc pas supposer que le getter et le setter auront la même visibilité.