“System.Int32”types的expression式不能用于返回types“System.Object”

我正在尝试制作一个简单的脚本系统,用于打印标签。 我已经在过去做了这个没有问题的反思,但我现在正在尝试使用Lambda函数来执行此操作,以便可以caching函数以供重用。

我到目前为止的代码如下…

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; } } 

这在某些情况下似乎有效,但在其他情况下则失败。 这个问题似乎是在我试图返回值作为对象 – 无论实际的数据types。 我正在尝试这样做,因为我不知道在编译时数据types是什么,但从长远来看,我只需要一个string。

每当我尝试访问Int32types的属性时,我都会收到此消息的标题中显示的exception – 但是我也正在为Nullabletypes和其他types获取它。 当我尝试将expression式编译到函数中时抛出exception。

任何人都可以build议我怎样才能在保持Lambdafunction的同时保持不同的状态,以便caching访问者?

你有没有尝试过使用Expression.Convert ? 这将增加拳击/升降等转换。

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