Основная проблема - некоторые свойства PerformanceCounter, такие как CategoryName, помечены атрибутом ReadOnly. Когда сетка свойств видит атрибут ReadOnly для свойства, вы не можете его редактировать, поэтому вы можете «вывести список со списком имен категорий».
Я не знаю, как то, что волшебник использует для преодоления этим дизайнером, но вот мое решение. Мы добавляем настраиваемый TypeDescriptionProvider к экземпляру Редактора PerformanceCounter и предоставляем дескриптор пользовательского типа, который удаляет ограничение ReadOnly.
Это, как вы можете использовать его (с экземпляром propertyGrid1 класса PropertyGrid):
PerformanceCounter counter = new PerformanceCounter();
// use a custom type description provider for this counter
TypeDescriptor.AddProvider(new PerformanceCounterTypeProvider(), counter);
// filter unwanted properties
propertyGrid1.BrowsableAttributes = new AttributeCollection(DesignerSerializationVisibilityAttribute.Visible);
// select it in the property grid
propertyGrid1.SelectedObject = counter;
И это код утилиты используется:
public class PerformanceCounterTypeProvider : TypeDescriptionProvider
{
private static PropertyDescriptor[] _properties;
static PerformanceCounterTypeProvider()
{
List < PropertyDescriptor> properties = new List<PropertyDescriptor>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(typeof(PerformanceCounter)))
{
PerformanceCounterPropertyDescriptor clone = new PerformanceCounterPropertyDescriptor(pd);
properties.Add(clone);
}
_properties = properties.ToArray();
}
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
{
return new PerformanceCounterTypeDescriptor();
}
private class PerformanceCounterTypeDescriptor : CustomTypeDescriptor
{
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
return new PropertyDescriptorCollection(PerformanceCounterTypeProvider._properties.ToArray());
}
}
private class PerformanceCounterPropertyDescriptor : PropertyDescriptor
{
private PropertyDescriptor _desc;
public PerformanceCounterPropertyDescriptor(PropertyDescriptor desc)
: base(desc, new List<Attribute>(desc.Attributes.OfType<Attribute>()).ToArray())
{
_desc = desc;
}
public override void SetValue(object component, object value)
{
// we can't use _desc.SetValue because the underlying property descriptor checks it's read only
ComponentType.GetProperty(Name).SetValue(component, value, null);
}
public override bool IsReadOnly
{
get { return false; }
}
public override bool CanResetValue(object component)
{
return _desc.CanResetValue(component);
}
public override Type ComponentType
{
get { return _desc.ComponentType; }
}
public override object GetValue(object component)
{
return _desc.GetValue(component);
}
public override Type PropertyType
{
get { return _desc.PropertyType; }
}
public override void ResetValue(object component)
{
_desc.ResetValue(component);
}
public override bool ShouldSerializeValue(object component)
{
return _desc.ShouldSerializeValue(component);
}
}
}
Свойство добавлен в окне Свойства специфичны для дизайнера. Как GenerateMember, вы не будете генерировать членов в PropertyGrid. Очень непонятно, почему вы думаете, что это проблема. –
Я не думаю, что это проблема. Я хотел бы архивировать то же самое, что я вижу в дизайнере, и хотел бы знать, как это сделать. – Pho3nixHun
К сожалению, я имел в виду * достижение – Pho3nixHun