2012-02-20 14 views
21

staram się odzwierciedlić na niektóre właściwości klasy i ustawić je programaticlly, ale wygląda jak jeden z moich filtrów PropertyInfo nie działa:„metoda zestaw nieruchomości nie znaleziono” błąd podczas odbicia

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty); 

I otrzymuję błąd na linii

pi.SetValue(this, valueFromData, null); 

Ponieważ nieruchomość ma tylko get{} metodę, nie set{} metody.

Moje pytanie brzmi, dlaczego ta właściwość nie została odfiltrowana z rekwizytów? Myślałem, że to jest celem BindingFlags.SetProperty.

Nieruchomość nie jest uzyskiwanie odfiltrowane:

public String CollTypeDescription 
    { 
     get { return _CollTypeDescription; } 
    } 

Uwaga, że ​​chcę, aby filtrować właściwości, które nie będą działać z wyprzedzeniem, bo jestem wymieniając je wszystkie naraz. Zrobić nie chcesz użyć pi.GetSetMethod() po fakcie, aby ustalić, czy mogę użyć Settera.

+2

@dtryon - nie - on OR-ing razem flagi dla opcji on chce ustawić . –

Odpowiedz

51

Z dokumentacji:

BindingFlags.SetProperty

Określa, że ​​wartość określonej właściwości powinny być ustawione. W przypadku właściwości modelu COM podając , jest to równoważne z określając PutDispProperty i PutRefDispProperty.

BindingFlags.SetProperty i BindingFlags.GetPropertyzrobić nie właściwości filtracyjne, które są brakujące ustawiające lub pobierające odpowiednio.

Aby sprawdzić, czy właściwość można ustawić, należy użyć właściwości CanWrite.

if (pi.CanWrite) 
    pi.SetValue(this, valueFromData, null); 
+0

Dzięki za informacje - nie można używać CanWrite, ponieważ ujawnia się tylko ustawiaczy publicznych, i nadal mogę korzystać z prywatnych ustawiaczy, ponieważ robię to z poziomu klasy. – Alain

+0

@Alain - Jesteś pewien? Właśnie zrobiłem test z prywatną własnością z kupującym i seterem. Właściwość CanWrite zwróciła true dla tej własności prywatnej. – ken

+0

Nieporozumienie z mojej strony. Masz rację - te dwie są wymienne, a ponieważ twoja metoda nie wymaga testu zerowego, jest to lepsze. – Alain

-1

Rozumiem GetProperties() metoda, tak że zwraca każdy obiekt, który ma BindingFlags.GetPropertylubBindingFlags.SetProperty.
Jeśli więc chcesz tylko właściwości, które mają seter, musisz usunąć flagę BindingFlags.GetProperty. Ale nie przetestowałem tego, więc mogę się mylić.

Moja odpowiedź dostała -1. Wygląda więc na to, że moja odpowiedź jest błędna.

2

Dziękuję Kenowi za informacje. Wygląda na to, że najlepszym rozwiązaniem mogę je filtrować je testując GetSetMethod (true) w filtrze LINQ:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null).ToArray(); 
+0

Zobacz mój komentarz do mojej odpowiedzi. CanWrite powraca "true" dla mnie w prywatnych nieruchomościach. Czy to nie działa tak samo dla ciebie? – ken

Powiązane problemy