vb.net修改类中自定义属性的值

时间:2014-11-13 21:29:11

标签: vb.net

我有一个想法是在类中的属性上使用自定义属性,以便在winforms界面中进行数据绑定。例如,使用无效数据设置和更改文本框上的背景颜色,前景色和工具提示。我发现我可以将txtTest的控件属性与backcolor等绑定到一个自定义属性,例如BackColorAttr,在类等名称中装饰属性,没有问题。属性值本身绑定到文本框的文本,双向绑定工作正常,初始背景颜色,forecolor等,从我希望的方式设置自定义属性的初始值。我正在通过BindingHelper类完成所有这些操作,该类将所有编码减少为几个通用方法。

我难倒的地方是稍后操纵自定义属性的值。例如,将背景颜色更改为红色。我尝试过的任何东西似乎都没有用。有没有人尝试这样的事情,或者对我如何进行有一些指导?

1 个答案:

答案 0 :(得分:0)

我不完全遵循第一部分或者什么绑定与颜色或属性有关,但那不是Attributes的工作方式。它们不是属性包装器,PropertiesMethodsTypes不知道与它们关联的Attributes(以及反之亦然)。它们是编译到程序集中的元数据。因此,您无法以任何有意义的方式更改值。

测试类和测试属性:

Public Class BarState
    Inherits Attribute

    Public Property State As String

    Public Sub New(t As String)
        State = t
    End Sub
End Class

Public Class Foo

    <BarState("red")>
    Public Property Name As String

End Class

由于State是属性,请测试我们是否可以设置它:

Dim f As New Foo

' get props for the Type
Dim pi As PropertyInfo = f.GetType.GetProperty("Name")

Dim attr = pi.GetCustomAttributes(GetType(BarState), False)

If attr.Length > 0 Then
    ' get prop info for the State property on the Attr Type
    Dim pa As PropertyInfo = attr(0).GetType.GetProperty("State")
    ' change it
    CType(attr(0), BarState).State = "GREEN"
    ' or 
    'pa.SetValue(attr(0), "GREEN", Nothing)

    ' print it  (prints "GREEN" but it does not persist)
    Console.WriteLine(CType(attr(0), BarState).State)
End If

'get the attr again as you might do next time thru
attr = pi.GetCustomAttributes(GetType(BarState), False)
' print the value   (Print "red")
Console.WriteLine(CType(attr(0), BarState).State)

第一次打印将是“GREEN”,但仅适用于此实例 - 它不会持续存在。下次你得到它,它会恢复为“红色”。由于属性类型,我们可以尝试使用注释掉的pa.SetValue(attr(0), "GREEN", Nothing)来更改值。它仍然不会持续存在,因为“红色”被编译到程序集中,这是你的起点始终是。

看起来您可以为所有类型的所有属性保留一个Dictionary或属性实例集合。这可能有效,但它们看起来都很相似,因此您必须创建一个哈希来跟踪哪个Attribute实例与Property Type上的{{1}}一致。

并且您必须使该集合与底层实例对象保持同步。 Attribute实例不会知道它来自的实例已经消失,因此状态设置应该还原,因此您的属性管理器需要处理它。


您可能会查看使用属性标记事物(例如值范围)的“weavers”,然后重写程序集以编辑标记属性的范围检查。一种类似于你之后的声音,我不知道他们可能会按照你描述的内容做什么。