2015-11-06 5 views
1

У меня есть классДобавить атрибут отображения переменной во время выполнения

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

Я хочу добавить Показать атрибуты этой переменной во время выполнения, а не делать это,

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

Любой возможный способ изменить или Назначить эти атрибуты из любого другого класса?

+0

Используйте поиск ... Это невозможно, но вы можете использовать TypeDescriptor, например. – Spawn

+0

Не обойтись без создания нового типа или какого-то типа ткачества. Атрибуты определены во время компиляции и скомпилированы в сборку. –

+0

@Spawn Любой пример использования TypeDescriptor? Я сделал объект TypeDescriptor, но понятия не имею, как связать его с любой переменной. –

ответ

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); } } 
} 
Смежные вопросы