özellik için setvalue yöntemi bulunamıyor [yinelenen]

Dec 13 2020

Herhangi bir nesnedeki tüm alanları yinelemenin bir yolunu bulmaya çalışıyorum.

Öncelikle değer alanlarını elde etmek ve yazdırmak için projeksiyon kullanmayı denedim, bu iyi çalıştı:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
       
 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             Console.WriteLine(property.Name + " val " +  property.GetValue(ob));
       }

Bununla birlikte, elbette, alanları bazı yeni değerlere ayarlamak istiyorum, bu yüzden üzerine okuduktan sonra, bunun işe yaraması gerekiyor gibi görünüyor:

 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             property.SetValue(ob,"new String");
       }

Bu bana "özellik seti yöntemi bulunamadı" veriyor. Ayrıca bazı yerlerde yapılan bir argüman olarak boş vermeyi deniyorum:

 property.SetValue(ob,"new String",null);

Bu aynı sonuçlara sahiptir. Bu neden bende başarısız oluyor?

DÜZENLEME: Amacımı yeterince tanımlamadığım bana işaret edildi. Yukarıda belirtildiği gibi amaç, tıpkı bu örnek nesne gibi, herhangi bir nesnedeki alanlar arasında yineleme yapmaktır:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };

Ve sonra da orijinal soruda, "Alanları bazı yeni değerlere ayarlamak istiyorum" yazıyorum, bu, "ob" nesnesindeki alanlar arasında yineleme yapmak ve onları yeni bir değere ayarlamak istediğim anlamına geliyor.

teşekkür ederim

Yanıtlar

1 JonSkeet Dec 13 2020 at 22:26

Bu neden bende başarısız oluyor?

Yazmakla aynı sebepten dolayı

ob.DeclarativeSecn = "new value";

en azından verdiğiniz örnek için derleme zamanında başarısız olur. Nesneniz anonim bir türdür ve anonim türlerdeki özelliklerin yalnızca alıcıları vardır - özellikler için yeni değerler belirlemenize izin vermezler. Daha sonra özellikleri değiştirebilmek istiyorsanız, anonim türleri kullanmayın.

Sorunuzun herhangi bir nesnenin özelliklerini yinelemekten bahsettiğini unutmayın , ancak:

  • Yazdırırken, tüm özelliklerin alıcıları olduğunu varsayarsınız; bu genellikle doğrudur, ancak her zaman değil
  • Yeni değerler belirlerken, tüm özelliklerin alıcıları olduğunu ve bunların dize özellikleri olduğunu varsayarsınız.

Bu varsayımların hiçbiri genel olarak doğru değildir . Dolayısıyla , herhangi bir nesneyi idare edebilmek istiyorsanız , daha fazla kontrol eklemeniz gerekir.

ThomasWeller Dec 13 2020 at 22:31

Anonim türler , önce bir türü açıkça tanımlamaya gerek kalmadan bir dizi salt okunur özelliği tek bir nesnede kapsüllemek için uygun bir yol sağlar .

Vurgu benim.

Görünüşe göre salt okunur bir özellik için bir değer ayarlayamazsınız. Mantıklı geliyor.