Пример #1
0
        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());
        }
Пример #2
0
        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);
        }
Пример #3
0
        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());
        }
Пример #4
0
        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);
        }
Пример #5
0
        public override object getXPath(PropertyTokenizer xPathTokenizer)
        {
            String completeXPath = xPathTokenizer.getCurrentPath();

            return(BizAgi.PAL.XPath.XPathUtil.evaluateXPath(this, completeXPath));
        }
Пример #6
0
        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);
        }