nie można znaleźć metody setvalue dla właściwości [duplikat]
Próbuję znaleźć sposób na iterację przez wszystkie pola dowolnego obiektu.
Najpierw próbowałem użyć projekcji, aby uzyskać pola wartości i je wydrukować, to działało ładnie:
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
Console.WriteLine(property.Name + " val " + property.GetValue(ob));
}
Jednak oczywiście chcę ustawić pola na jakieś nowe wartości, więc po przeczytaniu wygląda na to, że powinno działać:
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
property.SetValue(ob,"new String");
}
To daje mi informację „nie znaleziono metody zestawu właściwości”. Próbuję też podać null jako argument, co jest wykonywane w niektórych miejscach:
property.SetValue(ob,"new String",null);
To ma takie same wyniki. Dlaczego to mi się nie udaje?
EDYCJA: Zwrócono mi uwagę, że nie opisałem wystarczająco swojego celu. Jak wspomniano powyżej, celem jest iteracja pól w dowolnym obiekcie, tak jak w tym przykładowym obiekcie:
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
A potem również w pierwotnym pytaniu piszę "Chcę ustawić pola na jakieś nowe wartości" to znaczy, że chciałbym iterować przez pola w obiekcie "ob" i ustawić je na nową wartość.
Dziękuję Ci
Odpowiedzi
Dlaczego to mi się nie udaje?
Z tego samego powodu co pisanie
ob.DeclarativeSecn = "new value";
nie powiedzie się w czasie kompilacji, przynajmniej w podanym przykładzie. Twój obiekt jest typem anonimowym, a właściwości typów anonimowych mają tylko metody pobierające - nie pozwalają one na ustawienie nowych wartości dla właściwości. Jeśli chcesz mieć możliwość późniejszego modyfikowania właściwości, nie używaj typów anonimowych.
Zwróć uwagę, że twoje pytanie dotyczyło iteracji po właściwościach dowolnego obiektu, ale:
- Podczas drukowania zakładasz, że wszystkie właściwości mają metody pobierające; to powszechnie prawda, ale nie zawsze
- Ustawiając nowe wartości, zakładasz, że wszystkie właściwości mają metody pobierające i są właściwościami ciągu
Generalnie żadne z tych założeń nie jest poprawne . Więc jeśli chcesz mieć możliwość obsługi dowolnego obiektu, musisz dodać więcej sprawdzania.
Typy anonimowe zapewniają wygodny sposób hermetyzacji zestawu właściwości tylko do odczytu w pojedynczym obiekcie bez konieczności jawnego definiowania typu.
Podkreśl moje.
Wygląda na to, że nie możesz ustawić wartości właściwości tylko do odczytu. Brzmi rozsądnie.