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将成为引用和关联的提供程序。