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)); }
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)); }
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; } }