了解TypeDescriptor / PropertyDescriptor / etc

时间:2010-11-30 16:48:22

标签: c# .net reflection typedescriptor propertydescriptor

参见代码:

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)我认为更改暂时存储在提供程序中的另一个原因是我尝试创建一个名为Str且类型为string的属性,该属性实际上已存在于{{1 }}。代码将输出DataItem。如果我取消注释hello方法,则输出将为SetValue。我有任何误解吗?

1 个答案:

答案 0 :(得分:0)

将属性添加到实例(数据)而不是类型。您是否尝试过TypeDescriptor.AddAttributes(typeof(DataItem))?