level 13
Nukepayload2
楼主
我不知道这是不是一种反模式。把属性作为参数传递而不是把实现了特定接口的类直接传过去。
这样即使没有实现接口也可以像用属性一样获取或设置字段的值。使用时只要用两个Lambda表达式就够了。
不过这样做是不是对编译器的优化能力的要求太高了?尤其是用泛型类型实现的情况,如果编译时不能提前静态分析成c++模板(例如没有使用.net native编译,失去了很多优化的机会),在循环里使用这样的代码可能会影响性能。
下面是我写的"参数化属性"的实现。非常短。

'照顾手机党,发个文字版
Public Class ParameterizedProperty(Of T)
Public ReadOnly Property Getter As Func(Of T)
Public ReadOnly Property Setter As Action(Of T)
Public ReadOnly Property IsReadOnly As Boolean
Get
Return Getter IsNot Nothing AndAlso Setter Is Nothing
End Get
End Property
Public ReadOnly Property IsWriteOnly As Boolean
Get
Return Getter Is Nothing AndAlso Setter IsNot Nothing
End Get
End Property
Public Property Value As T
Get
Return Getter().Invoke
End Get
Set
Setter.Invoke(Value)
End Set
End Property
Public Shared Narrowing Operator CType(Prop As ParameterizedProperty(Of T)) As T
Return Prop.Value
End Operator
Sub New(Getter As Func(Of T), Setter As Action(Of T))
Me.Getter = Getter
Me.Setter = Setter
End Sub
End Class
2015年09月12日 16点09分
1
这样即使没有实现接口也可以像用属性一样获取或设置字段的值。使用时只要用两个Lambda表达式就够了。
不过这样做是不是对编译器的优化能力的要求太高了?尤其是用泛型类型实现的情况,如果编译时不能提前静态分析成c++模板(例如没有使用.net native编译,失去了很多优化的机会),在循环里使用这样的代码可能会影响性能。
下面是我写的"参数化属性"的实现。非常短。

'照顾手机党,发个文字版Public Class ParameterizedProperty(Of T)
Public ReadOnly Property Getter As Func(Of T)
Public ReadOnly Property Setter As Action(Of T)
Public ReadOnly Property IsReadOnly As Boolean
Get
Return Getter IsNot Nothing AndAlso Setter Is Nothing
End Get
End Property
Public ReadOnly Property IsWriteOnly As Boolean
Get
Return Getter Is Nothing AndAlso Setter IsNot Nothing
End Get
End Property
Public Property Value As T
Get
Return Getter().Invoke
End Get
Set
Setter.Invoke(Value)
End Set
End Property
Public Shared Narrowing Operator CType(Prop As ParameterizedProperty(Of T)) As T
Return Prop.Value
End Operator
Sub New(Getter As Func(Of T), Setter As Action(Of T))
Me.Getter = Getter
Me.Setter = Setter
End Sub
End Class