2010-11-30 2 views
1

コードを参照してください:理解TypeDescriptor /のPropertyDescriptorの/ etc

class DataItem 
{ 
    public DataItem(int num, string s) 
    { 
     Number = num; 
     Str = s; 
    } 
    public int Number { get; set; } 
    public string Str { get; set; } 
} 

static void Main(string[] args) 
{ 
    var data = new DataItem(2, "hi"); 

    var provider = TypeDescriptor.AddAttributes(typeof(DataItem), 
               new SerializableAttribute()); 

    var another = provider.CreateInstance(null, typeof(DataItem), 
           new Type[] { typeof(int), typeof(string) }, 
           new object[] { 100, "hello" }) as DataItem; 

    var newProperty = TypeDescriptor.CreateProperty(another.GetType(), "Str", 
             typeof(string), 
             new DescriptionAttribute("new property")); 
    //newProperty.SetValue(another, "new one"); 

    Console.WriteLine(newProperty.GetValue(another)); 
    Console.Read(); 
} 

を私はコードのためにいくつかの質問を持っている:

(1)私は、「これが何であるか、のDataItemのタイプにSerializableAttributeを追加しました変更 "が適用されますか? typeof(DataItem).GetCustomAttributes(true)でこの属性を取得できません。 "重要なDataItem"に変更が適用されていないようです。一時的にTypeDescriptionProviderに格納されていますか?

(2)インスタンスanotherは、プロバイダ(ここでは属性を追加した場所)によって作成されますが、この変数はSerializableAttributed DataItemのコンストラクタで作成された変数と同じになると思いますか? another.GetType().GetCustomAttributesで属性を取得できない場合でも、

(3)私は変更が一時的にプロバイダに保存されていると考えているもう一つの理由は、私が実際にすでにDataItemに存在し、その名前Strとタイプstring、とプロパティを作成しようとしたことです。コードはhelloを出力します。 SetValueメソッドのコメントを外すと、出力はnew oneになります。何か誤解はありますか?

答えて

0

属性は、タイプではなくインスタンス(データ)に追加されます。代わりにTypeDescriptor.AddAttributes(typeof(DataItem))を試しましたか?

+0

私は自分の質問を編集しました。私はこの質問で同じであると思います。 –

+0

OK、この場合は1)、TypeDescriptor.GetAttributes(typeof(DataItem))はSerializableAttributeを返します。 System.Typeは、実際にはアセンブリからロードされたメタデータを参照します。動的なカスタム型の場合、TypeDescriptorは参照(および関連するプロバイダ)になります。 –