【讨论】我们是否应该将属性作为参数传递
vb.net吧
全部回复
仅看楼主
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
level 12
测试过性能了吗,如果行能影响不大,这样挺方便。
2015年09月13日 02点09分 2
这个该怎么测试比较合适呢?与StrongBox比较?但是StrongBox有时候并不能替代它啊
2015年09月13日 02点09分
StrongBox打包了值,我这个是打包了委托
2015年09月13日 03点09分
从延迟初始化上看,我的这个方案是占优的。但是传递泛型委托会增加编译器优化的难度。
2015年09月13日 03点09分
线程安全上,StrongBox更不容易写错。
2015年09月13日 03点09分
1