在运行时设置BrowsableAttribute的值

时间:2009-09-17 17:04:06

标签: .net reflection attributes

我想在运行时为某些BrowsableAttribute实例的属性设置MyClass的值:

 public class MyClass
{
     [Browsable(true)]
     public int P1 { get; set } 
     ...
}

如果此属性不存在,请告知如何完成此操作以及如何在运行时将BrowsableAttribute添加到MyClass实例的属性。

3 个答案:

答案 0 :(得分:5)

你不能 - 除非你拦截加载程序集。属性存储在元数据中,并使用程序集加载,属性通常应该是不可变的(如BrowsableAttribute所示)。

基本上,属性不是意味着在执行时被修改。

答案 1 :(得分:2)

您可以实现一个自定义类型描述符 - 它会在使用它的任何方式上截取该属性。因此,具有看起来像属性的效果正在发生变化。

请参阅 - Part 1Part2

答案 2 :(得分:1)

你可以。我正在尝试这样的事情,我设法使用CategoryAttribute。但是,这会阻止属性网格一起工作,即使这是在按钮的构造函数中调用的:

Dim PC As PropertyDescriptorCollection = TypeDescriptor.GetProperties(Me)
For i As Integer = 0 To PC.Count - 1
        Dim att As BrowsableAttribute = DirectCast(PC(i).Attributes(GetType(BrowsableAttribute)), BrowsableAttribute)
        If Not att Is Nothing Then
            If att.Browsable = True Then
                Dim cat As Reflection.FieldInfo = att.GetType.GetField("Browsable", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.IgnoreCase)
                If Not cat Is Nothing Then
                    cat.SetValue(att, False)
                End If
            End If
        End If
Next

希望这有帮助