Понимание TypeDescriptor / PropertyDescriptor / и т. Д. - PullRequest
1 голос
/ 30 ноября 2010

См. Код:

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) Я добавил SerializableAttribute к типу DataItem, к чему применяется это «изменение»? Я не могу получить этот атрибут по typeof(DataItem).GetCustomAttributes(true). Кажется, что изменение не применяется к «существенному DataItem», оно временно сохраняется в TypeDescriptionProvider?

(2) Экземпляр another создается поставщиком (в который мы добавили атрибут), я думаю, что теперь эта переменная такая же, как переменная, созданная конструктором SerializableAttributed DataItem? даже если мы не можем получить атрибут по another.GetType().GetCustomAttributes.

(3) Еще одна причина, по которой я считаю, что изменение временно хранится в поставщике, заключается в том, что я попытался создать свойство с именем Str и типом string, которое на самом деле уже существует в DataItem. Код выведет hello. И если я раскомментирую метод SetValue, результат будет new one. Есть ли у меня недоразумения?

1 Ответ

0 голосов
/ 30 ноября 2010

Атрибуты добавляются к экземпляру (данным), а не к типу. Вы пробовали TypeDescriptor.AddAttributes (typeof (DataItem)) вместо этого?

...