2012-02-12 11 views
2

保護されたセッターを持つために私の基本クラスのプロパティを設定しました。 これは正常に動作し、派生クラスのコンストラクタでプロパティを設定できますが、PropertyDescriptorCollectionを使用してこのプロパティを設定しようとすると設定されませんが、他のすべてのプロパティでも機能します。派生クラスがPropertyDescriptorCollection.SetValueを使用して保護されたセッターにアクセスできない

保護されたAccess修飾子をすべて削除しても問題ありませんが、今は保護されていません。任意の入力に感謝します。

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"); 

     } 
    } 
+0

(あなたがusing System.Reflection;が必要になります)この

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

それとも単に

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

をお試しくださいあなたは "作業"?それは何をするためのものか? – svick

+0

svick、プロパティを検査したときに値が設定されていませんでした。スローされた例外はありませんでした。 – Brad

+0

これは、セットが保護されているためと思われますが、この場合、VSヘルプには何も見つかりません。私はまた警告も例外もなく何もしないのが好きです。 –

答えて

4

TypeDescriptorは、あなたがそのプロパティのセッターへのアクセス権を持っている必要がありますタイプからそれを呼び出すことを知らないので、PropertyDescriptorあなたが使用しているが読み取り専用(あなたがits IsReadOnly propertyをチェックすることでこれを確認することができます)。そして、読み取り専用の値を設定しようとすると、何も起こりません。PropertyDescriptorそれを回避するには

、通常のリフレクションを使用します。

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

property.SetValue(this, "abc", null); 
+0

ありがとう、それは働いた。設定されているプロパティの一部は派生クラスからのものです。私は、プロップが基本クラスからのものであれば、GetPropertyがインジケータとしてnull値を返したかどうかを調べました。 – Brad

+0

そういう場合、 'GetProperty()'は 'null'を返します。しかし、派生クラスのプロパティも必要なら 'typeof(derived_a)'を使うだけです。 – svick

0

は何

関連する問題