C# 理解TypeDescriptor/PropertyDescriptor/etc

C# 理解TypeDescriptor/PropertyDescriptor/etc,c#,.net,reflection,typedescriptor,propertydescriptor,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(

参见代码:

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();
}
对于代码,我有几个问题:

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,此更改应用于什么?我无法通过typeofDataItem.GetCustomAttributesRue获取此属性。更改似乎未应用于基本数据项,它临时存储在TypeDescriptionProvider中

2另一个实例是由Provider创建的,我们在其中添加了属性,我认为现在这个变量与SerializableAttributed DataItem的构造函数创建的变量相同?即使我们仍然无法通过另一个.GetType.GetCustomAttributes获取属性


3我认为更改临时存储在提供程序中的另一个原因是,我试图创建一个名为Str、类型为string的属性,该属性实际上已经存在于DataItem中。代码将输出hello。如果我取消对SetValue方法的注释,输出将是新的。我有什么误解吗?

属性被添加到实例数据中,而不是类型。您尝试过TypeDescriptor.AddAttributestypeofDataItem吗?

我已经编辑了我的问题。我认为在这个问题上它们是相同的。好的,在本例中,对于1,TypeDescriptor.GetAttributeTypeOfDataItem将返回SerializableAttribute。类型实际上是指从程序集加载的元数据。对于动态自定义类型,TypeDescriptor将成为引用和关联的提供程序。