我不太了解第一部分或者绑定与颜色或属性有什么关系,但这不是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)
第一个打印将是“绿色”,但这仅适用于这种情况 - 它不会持续存在。下次你得到它时,它会恢复为“红色”。由于属性 is 是一种类型,我们可以尝试使用被注释掉的pa.SetValue(attr(0), "GREEN", Nothing) 来通过反射来更改值。它仍然不会持续存在,因为“红色”被编译到程序集中,这就是您的起点。
您似乎可以为所有类型的所有属性保留一个字典或属性实例的集合。这可能会起作用,除非它们看起来都很相似,因此您必须创建一个哈希来跟踪哪个Attribute 实例与Property 和Type 匹配。
而且您必须使该集合与底层实例对象保持同步。 Attribute 实例不会知道它来自的实例已经消失,因此状态设置应该恢复,因此您的 Attribute 管理器需要处理它。
您可能会研究“编织者”,它使用属性来标记事物(例如值范围),然后重写程序集以编织标记属性的范围检查。听起来有点像你是什么,我不知道他们可能会按照你描述的方式做些什么。