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, destinationProps
i 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.
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'. –
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. –