1

我有一堂课

class demo
{
    public int var1 {set; get;}
}

我想在运行时在该变量上添加显示属性而不是这样做,

class Demo
{
    [Display (Name="Any Name", GroupName= "My Group 1")]
    public int var1 {set; get;}
}

任何可能的方法来更改或分配任何其他类的这些属性?

4

1 回答 1

1

非常简单的例子,它可以被构建并且在 PropertyGrid 中你会看到一些东西。您需要阅读有关 ICustomTypeDescriptor 和 PropertyDescriptor 的信息。

在表单加载时:

propertyGrid1.SelectedObject = new MyType(new[] { "Property1", "Property2" });

类型:

public class MyType : ICustomTypeDescriptor
{
    private string[] _properties;
    public MyType(string[] properties)
    {
        _properties = properties;
    }

    public AttributeCollection GetAttributes()
    {
        return null;
    }

    public string GetClassName()
    {
        return nameof(MyType);
    }

    public string GetComponentName()
    {
        throw new NotImplementedException();
    }

    public TypeConverter GetConverter()
    {
        return null;
    }

    public EventDescriptor GetDefaultEvent()
    {
        throw new NotImplementedException();
    }

    public PropertyDescriptor GetDefaultProperty()
    {
        return null;
    }

    public object GetEditor(Type editorBaseType)
    {
        return null;
    }

    public EventDescriptorCollection GetEvents()
    {
        throw new NotImplementedException();
    }

    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    {
        throw new NotImplementedException();
    }

    public PropertyDescriptorCollection GetProperties()
    {
        return GetProperties(null);
    }

    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        var props = new PropertyDescriptor[_properties.Length];
        for (int i = 0; i < _properties.Length; i++)
            props[i] = new CustomPropertyDescriptor(_properties[i],
                new Attribute[]
                {
                    new DisplayNameAttribute(@"Displ Value " + i),
                    new CategoryAttribute("Category" + i%2)
                });
        return new PropertyDescriptorCollection(props);
    }

    public object GetPropertyOwner(PropertyDescriptor pd)
    {
        return this;
    }
}

public class CustomPropertyDescriptor : PropertyDescriptor
{
    public CustomPropertyDescriptor(string name, Attribute[] attrs) : base(name, attrs)
    {
    }

    public override bool CanResetValue(object component)
    {
        return true;
    }

    public override object GetValue(object component)
    {
        return "1";
    }

    public override void ResetValue(object component)
    {
        throw new NotImplementedException();
    }

    public override void SetValue(object component, object value)
    {
        throw new NotImplementedException();
    }

    public override bool ShouldSerializeValue(object component)
    {
        return false;
    }

    public override Type ComponentType { get; }
    public override bool IsReadOnly { get { return false; } }
    public override Type PropertyType { get { return typeof (string); } }
}
于 2015-11-06T17:12:30.397 回答