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類型和其他類型獲取它。 當我嘗試將表達式編譯到函數中時引發異常。
任何人都可以建議我怎麼可能會去了解這個不同,同時保持拉姆達功能,以便我可以緩存存取?
你是非常接近這個答案,只有它是「表達」是需要轉換,而不是「parameterExpression」(表達式= Expression.Convert(表達式的typeof(對象)); )之前的彙編。 謝謝。 – 2010-02-04 14:29:05
糟糕 - 謝謝,修正。 – 2010-02-04 15:07:43
工作出色! – Schotime 2010-04-11 14:28:35