我試圖從MemberExpression
的實例中檢索屬性的值。從MemberExpression獲取屬性值
這是我到目前爲止有:
protected override void VisitMember(Context context, MemberExpression node)
{
var propertyInfo = node.Member as PropertyInfo;
if(propertyInfo != null)
{
var v = propertyInfo.GetValue(node.Member , null);
val = Convert.ToString(v);
}
context.State.Append(val);
}
根據我採取的辦法有兩個問題:我不知道預期的類型(字符串,整數,等...),和/或者我無法訪問MemberExpression
中的實例。
我正在爲T-SQL轉換器寫一個小的lambda表達式。例如(u)=> u.FirstName == u.LastName;
將轉換爲FirstName = 'chuck'
。我幾乎可以工作!
更新
我嘗試下面的代碼:
...
var propertyInfo = node.Member as PropertyInfo;
if(propertyInfo != null)
{
var o = propertyInfo.GetValue(node.Expression, null);
}
...
它沒有工作。我得到以下錯誤:
System.Reflection.TargetException : Object does not match target type.
更新2
這就是我試圖完成:
public static Func<T, object> GetValueGetter<T>(this PropertyInfo propertyInfo)
{
if (typeof(T) != propertyInfo.DeclaringType)
{
throw new ArgumentException();
}
var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
var property = Expression.Property(instance, propertyInfo);
var convert = Expression.TypeAs(property, typeof(object));
return (Func<T, object>)Expression.Lambda(convert, instance).Compile();
}
但我並不在編譯時知道T
。
我看過的所有例子都使用了Func(即'(Func )Expression.Lambda(convert,instance).Compile();'),這是一個帶泛型的轉換。泛型當然是編譯時間... –
2012-03-19 23:21:10
...我的問題是,我不知道類型,直到運行時。 – 2012-03-19 23:29:50
@ChuckConway:在這種情況下,您不需要泛型方法,只需要返回'Expression'的東西,據推測。 – 2012-03-20 06:44:44