2013-12-12 130 views
0

Supossedly,我有下面的代碼:生成Lambda表達式

Public Class Fruit 
    Public Property Name As String 

    Public Function GetName() As String 
     Return Name 
    End Function 
End Class 
Dim list As New List(Of Fruit) 

For index = 1 To 10 
    Dim fruitObj As New Fruit 
    fruitObj.Name = "Testing" + index.ToString() 
    list.Add(fruitObj) 
Next 

Dim iEnumerableString As IEnumerable(Of String) = list.Select(Function(m) m.Name) 

在代碼示例上面,如果我想生成Function(m) m.Name,我應該怎麼辦呢?

這樣,我可以如下稱之爲:

Dim iEnumerableString As IEnumerable(Of String) = 
list.Select(GenerateLambda("name")) 

感謝

回答

2

您可以創建表達式樹的參數調用。

GeneratePropertyExpression方法:

Private Shared Function GeneratePropertyExpression(Of TSource, TResult)(propertyName As String) As Func(Of TSource, TResult) 
    Dim parameter = Expression.Parameter(GetType(TSource), "x") 
    Dim propertyExpression = Expression.[Property](parameter, propertyName) 
    Return Expression.Lambda(Of Func(Of TSource, TResult))(propertyExpression, parameter).Compile() 
End Function 

用法:

Dim iEnumerableString As IEnumerable(Of String) = list.Select(GeneratePropertyExpression(Of Fruit, String)("Name")) 

我沒有測試過這一點,所以讓我知道,如果它不能正常工作。

+0

謝謝!是的,這是行之有效的。 – Hatjhie

+0

很酷。現在你應該花一些時間試着瞭解那裏發生了什麼(如果你還沒有這樣做的話)。這是學習新語言功能的最佳方式。 :) – MarcinJuraszek