Esempio n. 1
0
        private void initializeInstanceValue(IDataType type, Encoding encoding, object targetInstance, Type targetType, object targetMember, byte[] data, int offset)
        {
            object obj2 = null;

            switch (type.Category)
            {
            case DataTypeCategory.Primitive:
            case DataTypeCategory.String:
                this._internalConverter.TypeMarshaller.Unmarshal(type, encoding, data, offset, out obj2);
                this.initializeInstanceValue(targetInstance, targetMember, obj2);
                return;

            case DataTypeCategory.Alias:
            {
                IAliasType type2 = (IAliasType)type;
                this.initializeInstanceValue(type2.BaseType, encoding, targetInstance, targetType, targetMember, data, offset);
                return;
            }

            case DataTypeCategory.Enum:
            {
                IEnumType  enumType    = (IEnumType)type;
                Type       managedType = ((IManagedMappableType)enumType.BaseType).ManagedType;
                IEnumValue value2      = EnumValueFactory.Create(enumType, data, offset);
                if (!targetType.IsEnum)
                {
                    throw new ArgumentException("Type is not an enum type or enum base type!", "type");
                }
                obj2 = Enum.Parse(targetType, value2.ToString(), true);
                this.initializeInstanceValue(targetInstance, targetMember, obj2);
                return;
            }

            case DataTypeCategory.Array:
            {
                IArrayType type6       = (IArrayType)type;
                int        arrayRank   = targetType.GetArrayRank();
                Array      array       = (Array)targetInstance;
                int[]      numArray    = new int[arrayRank];
                int[]      numArray2   = new int[arrayRank];
                int[]      lowerBounds = type6.Dimensions.LowerBounds;
                int[]      upperBounds = type6.Dimensions.UpperBounds;
                for (int i = 0; i < arrayRank; i++)
                {
                    numArray[i]  = array.GetLowerBound(i);
                    numArray2[i] = array.GetUpperBound(i);
                }
                int position = 0;
                while (position < type6.Dimensions.ElementCount)
                {
                    int[] indicesOfPosition = ((ArrayType)type6).GetIndicesOfPosition(position);
                    int[] indices           = new int[indicesOfPosition.Length];
                    int   index             = 0;
                    while (true)
                    {
                        if (index >= indicesOfPosition.Length)
                        {
                            object obj3          = array.GetValue(indices);
                            int    elementOffset = ((ArrayType)type6).GetElementOffset(indicesOfPosition);
                            if (obj3 != null)
                            {
                                this.initializeInstanceValue(type6.ElementType, encoding, obj3, obj3.GetType(), indices, data, elementOffset);
                            }
                            else
                            {
                                TwinCAT.Ads.Module.Trace.TraceError("Failed to fill array element!");
                            }
                            position++;
                            break;
                        }
                        int num6 = numArray[index] - lowerBounds[index];
                        indices[index] = indicesOfPosition[index] + num6;
                        index++;
                    }
                }
                return;
            }

            case DataTypeCategory.Struct:
                foreach (IMember member in ((IStructType)type).AllMembers)
                {
                    PropertyInfo property = targetType.GetProperty(member.InstanceName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                    if (((property != null) && (property.GetGetMethod() != null)) && (property.GetSetMethod() != null))
                    {
                        this.initializeInstanceValue(member.DataType, encoding, targetInstance, targetType, property, data, offset + member.ByteOffset);
                        continue;
                    }
                    FieldInfo field = targetType.GetField(member.InstanceName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                    if (field != null)
                    {
                        this.initializeInstanceValue(member.DataType, encoding, targetInstance, targetType, field, data, offset + member.ByteOffset);
                    }
                    else
                    {
                        object[] args = new object[] { member.InstanceName, targetType.ToString() };
                        TwinCAT.Ads.Module.Trace.TraceWarning("Struct member '{0}' not found within {1}!", args);
                    }
                }
                break;

            case DataTypeCategory.SubRange:
            case DataTypeCategory.Bitset:
                break;

            case DataTypeCategory.Pointer:
            case DataTypeCategory.Reference:
            {
                int byteSize = ((IReferenceType)type).ByteSize;
                return;
            }

            default:
                throw new NotSupportedException();
            }
        }