我知道这个问题已被问过一百万次,但似乎所有这些问题都引用了丢失的对象或库引用。我用“TYPE”类型声明变量“K”。出于某种原因,这不会构建。
foreach (var propertyInfo in typeof(T).GetProperties())
{
//
// Gets the property from the obj
MemberExpression propertyExpression = Expression.Property(Expression.Constant(obj), propertyInfo);
//
// get the data type of the property
Type K = propertyExpression.Member.ReflectedType.UnderlyingSystemType;
//
// get the value of the property -- this line throws the error
var currentValue = Expression.Lambda<Func<K>>(propertyExpression).Compile().Invoke();
}
如果我注释掉它编译的例程的最后一行。
foreach (var propertyInfo in typeof(T).GetProperties())
{
//
// Gets the property from the obj
MemberExpression propertyExpression = Expression.Property(Expression.Constant(obj), propertyInfo);
//
// get the data type of the property
Type K = propertyExpression.Member.ReflectedType.UnderlyingSystemType;
//
// get the value of the property
//var currentValue = Expression.Lambda<Func<K>>(propertyExpression).Compile().Invoke();
}
当我注释掉最后一行时,我能够构建它。当我用最后一行注释调试代码时,当我“观察”变量时,我也会遇到同样的问题。我曾经读到这可能是因为我在发布模式下构建并且它丢弃了它认为不必要的任何变量,但是我正在调试模式中构建所以...... ??
我觉得这些年来我多次遇到过这个问题,而且总是“乱砍”我的方式。我想了解发生了什么,以便我能解决问题,而不是想出一些聪明的解决方法。
谢谢
答案 0 :(得分:2)
Expression.Lambda<Func<K>>(…)
这就是创建一个Expression<Func<K>>
,需要K
作为一种类型。
但你有一个变量K
。
但您似乎是基于反射创建表达式以获取值的属性值。只需坚持反思即可:
// theObject is the input
foreach (var pi in theObject.GetType().GetProperties()) {
object val = pi.GetValue(theObject);
// do something with val
}
答案 1 :(得分:0)
它很可能与foreach语境有关。考虑到它是一个动态的背景,意思是&#34; K&#34;在每次迭代中将是一个全新的实例,Expression.Lambda语句可能会拒绝使用K(也许它期望像类一样的常量,不确定)。尝试使用for和编号索引,并告诉我们结果。