将 LambdaParser 开源项目整合到Silverlight中,在Silverlight客户端上执行C#委托代码
LambdaParser源代码可在http://code.google.com/p/lambda-parser/ 下载
相关网址:http://www.cnblogs.com/zhucai/archive/2010/01/25/lambdaparser.html (朱才博客园)
修改条款:
1 修改了ExpressionParserCore.cs中的 GetTypeCore(string typeName)方法:
/// <summary> /// 根据类型名称获取类型的对象 /// </summary> /// <param name="typeName"></param> /// <returns></returns> private Type GetTypeCore(string typeName) { #if SILVERLIGHT Assembly a = typeof(System.Action).Assembly; Type type = a.GetType(typeName, false); if (type != null) return type; foreach (System.Windows.AssemblyPart ap in System.Windows.Deployment.Current.Parts) { System.Windows.Resources.StreamResourceInfo sri = System.Windows.Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative)); Assembly assembly = new System.Windows.AssemblyPart().Load(sri.Stream); type = assembly.GetType(typeName, false); if (type != null) return type; } #else // First - try all loaded types foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { Type type = assembly.GetType(typeName, false, true); if (type != null) return type; } #endif return type; }
2 编译时listParam.ConvertAll<Type>(m => m.Type).ToArray()会报错,换写该方法为GetTypes(listParam):
private Type[] GetTypes(List<System.Linq.Expressions.Expression> listParam) { List<Type> types = new List<Type>(); foreach (var expression in listParam) { types.Add(expression.Type); } return types.ToArray(); }
3 运行时ReadExpression中报错:“访问安全关键方法“System.Runtime.InteropServices.Marshal.SizeOf(System.Type)”的尝试失败。”
注释了case "typeof"
//#region case "sizeof": //case "sizeof": // { // string str = GetBracketString(false); // Type type = GetType(str); // //currentExpression = System.Linq.Expressions.Expression.Constant(System.Runtime.InteropServices.Marshal.SizeOf(type)); // } // break; //#endregion