2010-11-30 16 views
1

Voir le code:Comprendre 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(); 
} 

et j'ai plusieurs questions pour le code:

(1) J'ai ajouté un SerializableAttribute au type de DataItem, ce qui est ce " changer "appliqué à? Je ne peux pas obtenir cet attribut par typeof(DataItem).GetCustomAttributes(true). Il semble que la modification ne soit pas appliquée à la "essentielle DataItem", il est stocké dans le TypeDescriptionProvider temporairement?

(2) L'instance another est créée par le fournisseur (où nous avons ajouté l'attribut), je pense maintenant que cette variable est la même que celle créée par le constructeur de SerializableAttributed DataItem? même si nous ne pouvons toujours pas obtenir l'attribut par another.GetType().GetCustomAttributes.

(3) Une autre raison pour laquelle je crois que le changement est temporairement stocké dans le fournisseur est que j'ai essayé de créer une propriété avec son nom et le type Strstring, qui existe en fait déjà en DataItem. Le code affichera hello. Et si je décommente la méthode SetValue, la sortie sera new one. Ai-je des malentendus?

Répondre

0

Les attributs sont ajoutés à l'instance (données) et non au type. Avez-vous essayé TypeDescriptor.AddAttributes (typeof (DataItem)) à la place?

+0

J'ai modifié ma question. Je pense que dans cette question, ils sont les mêmes. –

+0

Ok, dans ce cas pour 1), TypeDescriptor.GetAttributes (typeof (DataItem)) retournera SerializableAttribute. System.Type fait vraiment référence aux métadonnées (chargées à partir d'un assemblage). Pour les types personnalisés dynamiques, TypeDescriptor devient la référence (et les fournisseurs associés). –