示例#1
0
        private static IMemberAccessor GetAccessor(object target, string propName, out System.Type memberType)
        {
            string args = null;

            if (propName != null)
            {
                int fi = propName.IndexOf("(");
                if (fi >= 0)
                {
                    int li = propName.LastIndexOf(")");
                    if (li < fi)
                    {
                        li = propName.Length;
                    }
                    args     = propName.Substring(fi + 1, li - fi - 1);
                    propName = propName.Substring(0, fi);
                }
            }

            ITweenMemberAccessor acc;

            if (CustomTweenMemberAccessorFactory.TryGetMemberAccessor(target, propName, out acc))
            {
                memberType = acc.Init(target, propName, args);
                return(acc);
            }

            //return MemberAccessorPool.GetAccessor(target.GetType(), propName, out memberType);
            return(MemberAccessorPool.GetDynamicAccessor(target, propName, out memberType));
        }
示例#2
0
        static void Main(string[] args)
        {
            var type         = typeof(Sample);
            var accessorPool = new MemberAccessorPool();
            var member       = type.GetMember(nameof(Sample.Name)).First() as PropertyInfo;
            var item         = new Sample();

            Console.WriteLine("cache single member accessor performance test");
            Console.WriteLine($"without cache { Check(10000, () => MemberAccessor.GetAccessor<Sample>(sample => sample.Name)) } ms elapsed");
            Console.WriteLine($"with cache { Check(10000, () => accessorPool.GetAccessor<Sample>(sample => sample.Name)) } ms elapsed");

            Console.WriteLine("cache all member accessor performance test");
            Console.WriteLine($"without cache { Check(10000, () => MemberAccessor.GetAccessors(type)) } ms elapsed");
            Console.WriteLine($"with cache { Check(10000, () => accessorPool.GetAccessors(type)) } ms elapsed");


            Console.WriteLine("benchmark with reflection");

            string sampleName = "test";

            Console.WriteLine($"without accessor { Check(500000, () => member.SetValue(item, sampleName)) } ms elapsed");

            var accessor = accessorPool.GetAccessors(type)[nameof(Sample.Name)];

            Console.WriteLine($"with accessor { Check(500000, () => accessor.SetValue(item, sampleName)) } ms elapsed");
        }
        private static IMemberAccessor GetAccessor(object target, string propName, out System.Type memberType)
        {
            if (_targetToCustomAccessor == null)
            {
                BuildAccessorDictionary();
            }

            string args = null;

            if (propName != null)
            {
                int fi = propName.IndexOf("(");
                if (fi >= 0)
                {
                    int li = propName.LastIndexOf(")");
                    if (li < fi)
                    {
                        li = propName.Length;
                    }
                    args     = propName.Substring(fi + 1, li - fi - 1);
                    propName = propName.Substring(0, fi);
                }
            }

            IList <CustomAccessorData> lst;

            if (_targetToCustomAccessor.Lists.TryGetList(propName, out lst))
            {
                var tp = target.GetType();
                CustomAccessorData data;
                int cnt = lst.Count;
                for (int i = 0; i < cnt; i++)
                {
                    data = lst[i];
                    if (data.TargetType.IsAssignableFrom(tp))
                    {
                        try
                        {
                            var acc = System.Activator.CreateInstance(data.AccessorType) as ITweenMemberAccessor;
                            memberType = acc.Init(propName, args);
                            return(acc);
                        }
                        catch
                        {
                            Debug.LogWarning("Failed to create Custom MemberAccessor of type '" + tp.FullName + "'.");
                            break;
                        }
                    }
                }
            }
            //return MemberAccessorPool.GetAccessor(target.GetType(), propName, out memberType);
            return(MemberAccessorPool.GetDynamicAccessor(target, propName, out memberType));
        }
示例#4
0
 private void InitAccessor()
 {
     _accessor = MemberAccessorPool.GetDynamicAccessor(_target, _memberName, out _memberType);
     if (_accessor == null)
     {
         _status = MemberStatus.Fault;
     }
     else if (ConvertUtil.IsSupportedType(_memberType))
     {
         _status = MemberStatus.Primitive;
     }
     else
     {
         _status = MemberStatus.Complex;
     }
 }