производный класс не может получить доступ к защищенному установщику с помощью PropertyDescriptorCollection.SetValue - PullRequest
2 голосов
/ 12 февраля 2012

Я установил одно из своих свойств в базовом классе, чтобы иметь защищенный установщик.это работает нормально, и я могу установить свойство в конструкторе производного класса - однако при попытке установить это свойство с помощью PropertyDescriptorCollection оно не будет установлено, однако использование коллекции работает со всеми другими свойствами.* Я должен отметить, что когда я удаляю модификатор защищенного доступа, все работает нормально ... но, конечно, теперь он не защищен.спасибо за любой вклад.

 class base_a
{

 public  string ID { get; protected set; }
 public virtual void SetProperties(string xml){}
}

class derived_a : base_a
 {
   public derived_a()
    {
    //this works fine
     ID = "abc"
    }
   public override void SetProperties(string xml)
    {
      PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(this);
      //this does not work...no value set.
      pdc["ID"].SetValue(this, "abc");

      }
  }

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

TypeDescriptor не знает, что вы вызываете его из типа, который должен иметь доступ к этому установщику свойства, поэтому используемый вами PropertyDescriptor доступен только для чтения (вы можете проверить это, проверив its IsReadOnly свойство ). И когда вы пытаетесь установить значение только для чтения PropertyDescriptor, ничего не происходит.

Чтобы обойти это, используйте нормальное отражение:

var property = typeof(base_a).GetProperty("ID");

property.SetValue(this, "abc", null);
0 голосов
/ 12 февраля 2012

Попробуйте это

PropertyInfo[] props = TypeDescriptor
    .GetReflectionType(this)
    .GetProperties();
props[0].SetValue(this, "abc", null);

Или просто

PropertyInfo[] props = this
    .GetType()
    .GetProperties();
props[0].SetValue(this, "abc", null);

(Вам понадобится using System.Reflection;)

...