2010-02-04 59 views
49

我想製作一個簡單的腳本系統,該系統將被用來打印標籤。我過去一直在用反射來完成這個任務,但我現在正在嘗試使用Lambda函數來完成這個任務,以便我可以緩存這些函數以供重用。表達「System.Object的」

我到目前爲止的代碼如下...

public static string GetValue<T>(T source, string propertyPath) { 

    try { 

     Func<T, Object> func; 

     Type type = typeof(T); 
     ParameterExpression parameterExpression = Expression.Parameter(type, @"source"); 
     Expression expression = parameterExpression; 
     foreach (string property in propertyPath.Split('.')) { 
      PropertyInfo propertyInfo = type.GetProperty(property); 
      expression = Expression.Property(expression, propertyInfo); 
      type = propertyInfo.PropertyType; 
     } 

     func = Expression.Lambda<Func<T, Object>>(expression, parameterExpression).Compile(); 

     object value = func.Invoke(source); 
     if (value == null) 
      return string.Empty; 
     return value.ToString(); 

    } 
    catch { 

     return propertyPath; 

    } 

} 

這似乎在某些情況下工作,但在別人失敗。這個問題似乎是在我試圖返回值的對象 - 無論實際的數據類型。我試圖這樣做,因爲我不知道在編譯時數據類型是什麼,但從長遠來看,我只需要一個字符串。

無論何時我嘗試訪問Int32類型的屬性,我都會收到此消息的標題中顯示的異常 - 但我也在爲Nullable類型和其他類型獲取它。 當我嘗試將表達式編譯到函數中時引發異常。

任何人都可以建議我怎麼可能會去了解這個不同,同時保持拉姆達功能,以便我可以緩存存取?

回答

94

您是否嘗試過使用Expression.Convert?這將增加拳擊/提升/等轉換。

Expression conversion = Expression.Convert(expression, typeof(object)); 
func = Expression.Lambda<Func<T, Object>>(conversion, parameterExpression).Compile(); 
+1

你是非常接近這個答案,只有它是「表達」是需要轉換,而不是「parameterExpression」(表達式= Expression.Convert(表達式的typeof(對象)); )之前的彙編。 謝謝。 – 2010-02-04 14:29:05

+1

糟糕 - 謝謝,修正。 – 2010-02-04 15:07:43

+0

工作出色! – Schotime 2010-04-11 14:28:35

相關問題