См. Код:
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
. Есть ли у меня недоразумения?