簡體   English   中英

vb.net修改類中的自定義屬性的值

[英]vb.net modifying values of custom attributes in a class

我有一個想法,就是在類的屬性上使用自定義屬性,以便在winforms界面中進行數據綁定。 例如,在具有無效數據的文本框上設置和更改背景色,前色和工具提示。 我發現可以將txtTest的控件屬性綁定到Backcolor等自定義屬性,例如BackColorAttr,可以毫無問題地修飾類(例如Name)中的屬性。 屬性值本身綁定到文本框的Text,雙向綁定就可以了,初始自定義背景色,前色等,是按照我希望的方式從自定義屬性的初始值設置的。 我正在通過BindingHelper類來完成所有這些工作,該類將所有編碼減少為幾個通用方法。

我感到難過的是在以后處理自定義屬性的值。 例如,將背景色更改為紅色。 我嘗試過的一切似乎都沒有效果。 是否有人嘗試過這樣的事情,或者對我如何進行有一些指導?

我不太了解第一部分,也不了解綁定與顏色或屬性有什么關系,但這不是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實例與哪個Type上的Property一起使用。

而且,您必須使該集合與基礎實例對象保持同步。 Attribute實例不會知道它來自的實例已經消失,因此狀態設置應還原,因此您的Attribute Manager將需要處理該實例。


您可能會研究“編織者”,該編織者使用屬性標記事物(例如值范圍),然后重寫程序集以對標記屬性進行范圍檢查。 聽起來像您之后的聲音,但我不知道它們可能還會按照您的描述行事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM