2008-10-09 3 views
6

Ich habe dies:Wie kann ich feststellen, ob eine Klasseneigenschaft eine öffentliche Gruppe (.NET) aufweist?

public string Log 
     { 
      get { return log; } 
      protected set 
      { 
       if (log != value) 
       { 
        MarkModified(PropertyNames.Log, log); 
        log = value; 
       } 
      } 

     } 

Und meine Utility-Klasse für Datenbindung tut dies:

PropertyInfo pi = ReflectionHelper.GetPropertyInfo(boundObjectType, sourceProperty); 

if (!pi.CanWrite) 
       SetReadOnlyCharacteristics(boundEditor); 

Aber PropertyInfo.CanWrite kümmert sich nicht darum, ob der Satz öffentlich zugänglich ist, nur, dass es existiert.

Wie kann ich feststellen, ob ein Satz öffentlichen ist, nicht nur jeder Satz?

Antwort

1

Eine Alternative zu den vorgeschlagenen Änderungen an ReflectionHelper in anderen Antworten ist pi.GetSetMethod(false) aufrufen und sehen, ob das Ergebnis null ist.

2

Sie müssen die BindingFlags verwenden. So etwas wie

PropertyInfo property = type.GetProperty("MyProperty", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance); 
0

In Ihrem ReflectionHelper.GetPropertyInfo(), können Sie vermutlich zu einem boundObjectType.GetType(). GetProperties(), wobei die Parameter Binding offenbar BindingFlags.NonPublic enthält. Sie möchten nur BindingFlags.Public angeben

+0

Dies wird nicht funktionieren, Eigentum kann öffentlich sein, während seine "Set" kann privat oder intern sein. –

1

Rufen Sie GetSetMethod auf PropertyInfo auf, rufen Sie MethodInfo ab und untersuchen Sie seine Eigenschaften wie IsPublic.

0

Nun, es ist ein wenig schwer zu sagen, da Sie eine "ReflectionHelper" -Klasse haben, wo wir die Quelle nicht sehen können. Meine erste Vermutung ist jedoch, dass Sie das BindingFlags-Attribut nicht ordnungsgemäß festlegen, wenn Sie Type.GetProperty aufrufen. Sie müssen im öffentlichen Aufzählungs-Flag OR angeben, um sicherzustellen, dass nur öffentliche Werte zurückgegeben werden.