派生类无法使用PropertyDescriptorCollection.SetValue访问受保护的setter



我已经将基类中的一个属性设置为具有受保护的setter。这很好,我可以在派生类的构造函数中设置属性-但是,当我尝试使用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");
      }
  }

TypeDescriptor不知道您从应该有权访问该属性setter的类型调用它,所以您使用的PropertyDescriptor是只读的(您可以通过检查其IsReadOnly属性来验证这一点)。当您尝试设置只读PropertyDescriptor的值时,什么也不会发生。

要解决此问题,请使用法线反射:

var property = typeof(base_a).GetProperty("ID");
property.SetValue(this, "abc", null);

试试这个

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;

相关内容

  • 没有找到相关文章

最新更新