コード例 #1
0
        private object SetRepeatingTypeParent(TagMapLeaf leaf, TagMapParent parent, FixMessageContext fixMessageContext, object targetObject)
        {
            int index = GetAdvancedIndex(GetKey(leaf.Current), parent, fixMessageContext, out bool isAdvanced);

            if (isAdvanced)
            {
                object?childObject = Activator.CreateInstance(parent.InnerType);
                if (childObject is null)
                {
                    throw new InvalidOperationException();
                }
                Type typeOfParent = parent.InnerType;
                if (_delegateFactoryCache == null)
                {
                    var methodInfo        = typeof(BaseSetter).GetMethod("GetEnumeratedILSetterAction", BindingFlags.NonPublic | BindingFlags.Instance);
                    var generatedDelegate = (Delegate?)methodInfo?.MakeGenericMethod(typeOfParent).Invoke(this, new[] { parent.Current });
                    _delegateFactoryCache = generatedDelegate ?? throw new InvalidOperationException();
                }
                _delegateFactoryCache.DynamicInvoke(targetObject, childObject, index);
                return(childObject);
            }

            targetObject = (parent.Current.GetValue(targetObject) as IEnumerable <object>).ElementAt(index);
            return(targetObject);
        }
コード例 #2
0
 public object Set(TagMapLeaf mappingDetails, TagMapParent parent, FixMessageContext fixMessageContext, object targetObject)
 {
     if (parent.IsEnumerable)
     {
         targetObject = SetRepeatingTypeParent(mappingDetails, parent, fixMessageContext, targetObject);
     }
     else
     {
         targetObject = SetSimpleTypeParent(parent, fixMessageContext, targetObject);
     }
     return(targetObject);
 }
コード例 #3
0
        private object?SetSimpleTypeParent(TagMapParent parent, FixMessageContext fixMessageContext, object targetObject)
        {
            if (!fixMessageContext.CreatedParentTypes.Contains(GetKey(parent.Current)))
            {
                object?childObject = Activator.CreateInstance(parent.Current.PropertyType);
                if (childObject is null)
                {
                    throw new InvalidOperationException();
                }
                Type typeOfParent = childObject.GetType();
                if (_delegateFactoryCache == null)
                {
                    var methodInfo        = typeof(BaseSetter).GetMethod("GetILSetterAction", BindingFlags.NonPublic | BindingFlags.Instance);
                    var generatedDelegate = (Delegate?)methodInfo?.MakeGenericMethod(typeOfParent).Invoke(this, new[] { parent.Current });
                    _delegateFactoryCache = generatedDelegate ?? throw new InvalidOperationException();
                }
                _delegateFactoryCache.DynamicInvoke(targetObject, childObject);

                fixMessageContext.CreatedParentTypes.Add(GetKey(parent.Current));
                return(childObject);
            }
            return(parent.Current.GetValue(targetObject));
        }
コード例 #4
0
 public object Set(TagMapLeaf leaf, TagMapParent parent, FixMessageContext fixMessageContext, object targetObject)
 {
     IsVerified = true;
     return(targetObject);
 }
コード例 #5
0
 private TagMapParent CreateRepeatingParentNode(PropertyInfo property, RepeatingGroupAttribute repeatingGroup, Type innerType)
 {
     return(TagMapParent.CreateEnumerable(property, repeatingGroup.Tag, innerType, _propertySetterFactory.GetParentSetter(property)));
 }