见代码:
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)
似乎更改未应用于“基本数据项”,它暂时存储在 TypeDescriptionProvider 中?
(2)实例another
是由提供者创建的(我们添加属性的地方),我想现在这个变量和SerializableAttributed DataItem的构造函数创建的变量是一样的吗?即使我们仍然无法通过another.GetType().GetCustomAttributes
.
(3) 我认为更改暂时存储在提供程序中的另一个原因是我试图创建一个具有其名称Str
和类型的属性,该属性string
实际上已经存在于DataItem
. 代码将输出hello
. 如果我取消注释该SetValue
方法,输出将是new one
. 我有什么误解吗?