2011-07-03 15 views
25

Prawdopodobnie głupie pytanie, ale nie mogłem znaleźć żadnego wyjaśnienia w Internecie.
Jaki jest szczególny powód tego kodu, który nie działa? Kod ma na celu skopiowanie wartości właściwości z Contact (źródło) do nowo utworzonego obiektu ContactBO (docelowego).Metoda GetProperties z BindingFlags.Public nie zwraca niczego.

public ContactBO(Contact contact) 
{ 
    Object source = contact; 
    Object destination = this; 

    PropertyInfo[] destinationProps = destination.GetType().GetProperties(
     BindingFlags.Public); 
    PropertyInfo[] sourceProps = source.GetType().GetProperties(
     BindingFlags.Public); 

    foreach (PropertyInfo currentProperty in sourceProps) 
    { 
     var propertyToSet = destinationProps.First(
      p => p.Name == currentProperty.Name); 

     if (propertyToSet == null) 
      continue; 

     try 
     { 
      propertyToSet.SetValue(
       destination, 
       currentProperty.GetValue(source, null), 
       null); 
     } 
     catch (Exception ex) 
     { 
      continue; 
     } 
    } 
} 

Obie klasy mają takie same nazwy właściwości (klasa BO ma kilka innych, ale nie ma znaczenia przy inicjalizacji). Obie klasy mają tylko właściwości publiczne. Po uruchomieniu powyższego przykładu, destinationPropsi mają długości zero.

Ale po rozwinięciu metody GetProperties z BindingFlags.Instance, nagle zwraca wszystko. Byłbym wdzięczny, gdyby ktoś mógł rzucić światło na tę sprawę, ponieważ jestem zgubiony.

+1

Jeśli chcesz sprawdzić przed '' null' propertyToSet' nie należy używać 'First' ponieważ będzie rzucić wyjątek, jeśli nie może znaleźć przedmiot, który nie dopasuj predykat. Zamiast tego użyj 'FirstOrDefault'. –

+2

Aby uratować tych, którzy poświęcają tyle samo uwagi, co ja, na różnicę między własnością a polem, wypróbuj GetFields(); Whups. –

Odpowiedz

37

Z dokumentacji metody GetProperties:

Musisz podać albo BindingFlags.Instance lub BindingFlags.Static w celu uzyskania powrót.

+1

Dokładnie to robię. Powodem było pytanie, dlaczego BindingFlags.Public nie zwraca własności publicznych? Cóż, myślę, że tak właśnie działa framework. –

22

To zachowanie jest spowodowane tym, że należy określić statyczny lub wystąpienie członków w BindingFlags. BindingFlags to wyliczanie flag, które można łączyć przy użyciu | (bitowej lub).

Co chcesz to:

.GetProperties(BindingFlags.Instance | BindingFlags.Public); 
Powiązane problemy