2011-01-05 81 views
1

我想创建一个简单的函数,执行以下操作:linq表达式的动态属性setter?

Sub SetValue(Of TInstance As Class, TProperty)(
    ByVal instance As TInstance, 
    ByVal [property] As Expression(Of Func(Of TInstance, TProperty)), 
    ByVal value As TProperty) 

    '... 
End Sub 

用法:

Dim x As New Person 
SetValue(x, Function(p) p.FirstName, "John Doe") 

回答

1

这其实很简单:

Sub SetValue(Of TInstance As Class, TProperty)(
    ByVal instance As TInstance, 
    ByVal [property] As Expression(Of Func(Of TInstance, TProperty)), 
    ByVal value As TProperty) 


    'TODO: validate nulls 
    If [property].Body.NodeType <> ExpressionType.MemberAccess Then _ 
    Throw New ArgumentException("Invalid lambda expression.", "property") 


    Dim body = DirectCast([property].Body, MemberExpression) 
    Dim member = DirectCast(body.Member, PropertyInfo) 
    member.SetValue(instance, value, Nothing) 
End Sub 

HTH