[英]vb.net modifying values of custom attributes in a class
我有一個想法,就是在類的屬性上使用自定義屬性,以便在winforms界面中進行數據綁定。 例如,在具有無效數據的文本框上設置和更改背景色,前色和工具提示。 我發現可以將txtTest的控件屬性綁定到Backcolor等自定義屬性,例如BackColorAttr,可以毫無問題地修飾類(例如Name)中的屬性。 屬性值本身綁定到文本框的Text,雙向綁定就可以了,初始自定義背景色,前色等,是按照我希望的方式從自定義屬性的初始值設置的。 我正在通過BindingHelper類來完成所有這些工作,該類將所有編碼減少為幾個通用方法。
我感到難過的是在以后處理自定義屬性的值。 例如,將背景色更改為紅色。 我嘗試過的一切似乎都沒有效果。 是否有人嘗試過這樣的事情,或者對我如何進行有一些指導?
我不太了解第一部分,也不了解綁定與顏色或屬性有什么關系,但這不是Attributes
工作原理。 它們不是屬性包裝器,並且Properties
, Methods
和Types
不了解與它們關聯的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
實例與哪個Type
上的Property
一起使用。
而且,您必須使該集合與基礎實例對象保持同步。 Attribute實例不會知道它來自的實例已經消失,因此狀態設置應還原,因此您的Attribute Manager將需要處理該實例。
您可能會研究“編織者”,該編織者使用屬性標記事物(例如值范圍),然后重寫程序集以對標記屬性進行范圍檢查。 聽起來像您之后的聲音,但我不知道它們可能還會按照您的描述行事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.