使用Perst for Windows Phone选择对象后出错

时间:2011-08-09 17:06:10

标签: linq windows-phone-7 silverlight-3.0

我有以下情况:

我的WP7应用程序有一个登录屏幕,执行以下代码行:

var userQuery = DataAccessManager.Instance.Database.Select<LocalUser>(u => _userLogin.Equals(u.Login));  //_userLogin and Login property are strings
var lstUser = userQuery.ToList();

在某些情况下,我需要再次调用登录屏幕,它使用上面相同的代码行执行相同的方法。但是,在第二次调用

时出现以下错误
var lstUser = userQuery.ToList();

Mobiltec.Atheneum.Common.Utils.Synchronization.AuthHandler + LT;&GT; c__DisplayClass2 USERLOGIN    在System.Reflection.RuntimeFieldInfo.GetValue(Object obj)    在System.Linq.jvm.ExpressionInterpreter.b _0(FieldInfo字段)    在System.Linq.jvm.Extensions.OnFieldOrProperty(MemberInfo self,Action 1 onfield, Action 1 onprop)    在System.Linq.jvm.ExpressionInterpreter.VisitMemberInfo(MemberInfo mi)    在System.Linq.jvm.ExpressionInterpreter.VisitMemberAccess(MemberExpression成员)    在System.Linq.jvm.ExpressionVisitor.Visit(表达式表达式)    在System.Linq.jvm.ExpressionInterpreter.VisitMethodCall(MethodCallExpression调用)    在System.Linq.jvm.ExpressionVisitor.Visit(表达式表达式)    在System.Linq.jvm.ExpressionInterpreter.Interpret(LambdaExpression lambda,Object []参数)    在System.Linq.jvm.Interpreter.Run(Object [] arg)    在System.Linq.jvm.Interpreter.FuncRunner [T,TResult](LocalUser arg)    at Perst.Database.LinqEnumerator 1.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source)    在Mobiltec.Atheneum.Common.Utils.Synchronization.AuthHandler.Authenticate(String _userLogin,String _password,String deviceNickname)    在Mobiltec.Atheneum.Reader.WindowsPhone.Controls.LoginControl。&lt;&gt; c _DisplayClass4.b__0(对象状态)    在System.Threading.ThreadPool.WorkItem.doWork(Object o)    在System.Threading.Timer.ring()

有任何想法吗?我们在Silverlight to Desktop应用程序中拥有相同的类,我不知道为什么WP7会发生这种情况。

PS1:只有LocalUser类才会出现这个问题...它适用于任何类。

PS2:如果我使用它:

var userQuery = DataAccessManager.Instance.Database.Select<LocalUser>(u => "cesarautor@atheneum.com".Equals(u.Login)); //as sample...any dumb string works

而不是

var userQuery = DataAccessManager.Instance.Database.Select<LocalUser>(u => _userLogin.Equals(u.Login));

它有效......

提前致谢

1 个答案:

答案 0 :(得分:1)

我找到了一些关于Perst和FieldAccessException的其他参考资料:例如http://forums.mcobject.com/index.php?showtopic=7916

猜测,这将是代码以某种方式尝试在该表达式上使用反射引起的 - 因为这将在Silverlight桌面的限制较少的环境中正常工作。

如果更改_userLogin引用而不是引用局部变量,它是否有效 - 因为这可能需要更少/不同的反射调用