public void AccessNest2() { var propertyTokenizer = new PropertyTokenizer("User.Info.Id"); propertyTokenizer.MoveNext(); var current = propertyTokenizer.Current; Assert.Equal("User", current.Name); Assert.Null(current.Index); Assert.Equal("Info.Id", current.Children); propertyTokenizer.MoveNext(); current = propertyTokenizer.Current; Assert.Equal("Info", current.Name); Assert.Null(current.Index); Assert.Equal("Id", current.Children); propertyTokenizer.MoveNext(); current = propertyTokenizer.Current; Assert.Equal("Id", current.Name); Assert.Null(current.Index); Assert.Null(current.Children); Assert.False(propertyTokenizer.MoveNext()); }
public void IndexAccessString() { var propertyTokenizer = new PropertyTokenizer("Items[Name]"); var current = propertyTokenizer.Current; Assert.Equal("Items", current.Name); Assert.Equal("Name", current.Index); Assert.Null(current.Children); }
public void IndexAccess() { var propertyTokenizer = new PropertyTokenizer("Items[0]"); var current = propertyTokenizer.Current; Assert.Equal("Items", current.Name); Assert.Equal("0", current.Index); Assert.Null(current.Children); Assert.False(propertyTokenizer.MoveNext()); }
public bool TryCreate(Type targetType, PropertyTokenizer propertyTokenizer, out Func <object, object> getMethodImpl) { var key = $"{targetType.FullName}__{propertyTokenizer.FullName}"; getMethodImpl = CacheUtil <EmitGetAccessorFactory, String, Func <object, object> > .GetOrAdd(key, s => { TryCreateImpl(targetType, propertyTokenizer, out var getMethod); return(getMethod); }); return(getMethodImpl != null); }
public override object getXPath(PropertyTokenizer xPathTokenizer) { String completeXPath = xPathTokenizer.getCurrentPath(); return(BizAgi.PAL.XPath.XPathUtil.evaluateXPath(this, completeXPath)); }
private bool TryCreateImpl(Type targetType, PropertyTokenizer propertyTokenizer, out Func <object, object> getMethodImpl) { getMethodImpl = null; var dynamicMethod = new DynamicMethod("Get_" + Guid.NewGuid().ToString("N"), CommonType.Object, new[] { CommonType.Object }, targetType, true); var ilGen = dynamicMethod.GetILGenerator(); ilGen.LoadArg(0); var propertyType = targetType; while (propertyTokenizer.MoveNext()) { var current = propertyTokenizer.Current; switch (current.Mode) { case AccessMode.Get: { var propertyInfo = propertyType.GetProperty(current.Name); if (propertyInfo == null) { return(false); } ilGen.Call(propertyInfo.GetMethod); propertyType = propertyInfo.PropertyType; if (propertyType.IsValueType) { ilGen.Box(propertyType); } break; } case AccessMode.IndexerGet: { var propertyInfo = propertyType.GetProperty(current.Name); if (propertyInfo == null) { return(false); } ilGen.Call(propertyInfo.GetMethod); MethodInfo indexerGet; if (propertyInfo.PropertyType.IsArray) { indexerGet = propertyInfo.PropertyType.GetMethod("Get", new[] { CommonType.Int32 }); } else { indexerGet = propertyInfo.PropertyType.GetMethod("get_Item"); } if (indexerGet == null) { throw new SmartSqlException($"can not find Get Indexer:{propertyInfo.PropertyType}"); } var indexerGetParamType = indexerGet.GetParameters().First().ParameterType; if (indexerGetParamType == CommonType.String) { ilGen.LoadString(current.Index); } else if (indexerGetParamType == CommonType.Int32) { if (!Int32.TryParse(current.Index, out var idx)) { throw new SmartSqlException($"Index:[{current.Index}] can not convert to Int32."); } ilGen.LoadInt32(idx); } ilGen.Call(indexerGet); propertyType = indexerGet.ReturnType; if (propertyType.IsValueType) { ilGen.Box(propertyType); } break; } } } ilGen.Return(); getMethodImpl = (Func <object, object>)dynamicMethod.CreateDelegate(typeof(Func <object, object>)); return(true); }