示例#1
0
        /// <summary>
        /// Collects the metadata in the definition.
        /// </summary>
        private void CollectMetadata()
        {
            //Get the indices and choices
            definedAllowedIndices = new List <long?>();
            List <ChoiceMetaData> metaDataList = new List <ChoiceMetaData>();

            MemberInfo[] mis = GetType().GetMembers(
                BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance |
                BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);

            foreach (var mi in mis)
            {
                //Get Choice Index.
                if (mi.IsDefined(typeof(Asn1ChoiceIndex), true))
                {
                    object o;
                    if (mi.MemberType == MemberTypes.Property)
                    {
                        PropertyInfo pi = mi as PropertyInfo;
                        o = pi.GetValue(this, null);
                    }
                    else if (mi.MemberType == MemberTypes.Field)
                    {
                        FieldInfo fi = mi as FieldInfo;
                        o = fi.GetValue(this);
                    }
                    else
                    {
                        throw new Asn1UnreachableExcpetion(ExceptionMessages.Unreachable);
                    }
                    long allowedIndex = Convert.ToInt64(o);
                    if (definedAllowedIndices.Contains(allowedIndex))
                    {
                        throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent +
                                                                  " Duplicated indices.");
                    }
                    definedAllowedIndices.Add(allowedIndex);
                }
                //Get Choice.
                if (mi.IsDefined(typeof(Asn1ChoiceElement), true))
                {
                    if (mi.MemberType == MemberTypes.Field ||
                        mi.MemberType == MemberTypes.Property)
                    {
                        ChoiceMetaData metaData = new ChoiceMetaData(this, mi);
                        metaDataList.Add(metaData);
                    }
                    else
                    {
                        throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent
                                                                  + " Asn1ChoiceElement property could only be used in properties or fields.");
                    }
                }
            }

            //Ensure the consistency of the definition.
            definedAllowedIndices.Sort();
            metaDataList = new List <ChoiceMetaData>(metaDataList.OrderBy(var => var.AttachedIndex));
            List <long?> indicesDefinedInChoices = metaDataList.ConvertAll(var => var.AttachedIndex);

            if (!definedAllowedIndices.SequenceEqual(indicesDefinedInChoices))
            {
                throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent +
                                                          " Stated Indices are different from the indices in choice elements' attributes.");
            }

            metaDatas = metaDataList.ToArray();
        }
        /// <summary>
        /// Collects the metadata in the definition.
        /// </summary>
        private void CollectMetadata()
        {
            //Get the indices and choices
            definedAllowedIndices = new List<long?>();
            List<ChoiceMetaData> metaDataList = new List<ChoiceMetaData>();

            MemberInfo[] mis = GetType().GetMembers(
                BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance |
                BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);

            foreach (var mi in mis)
            {
                //Get Choice Index.
                if (mi.IsDefined(typeof(Asn1ChoiceIndex), true))
                {
                    object o;
                    if (mi.MemberType == MemberTypes.Property)
                    {
                        PropertyInfo pi = mi as PropertyInfo;
                        o = pi.GetValue(this, null);
                    }
                    else if (mi.MemberType == MemberTypes.Field)
                    {
                        FieldInfo fi = mi as FieldInfo;
                        o = fi.GetValue(this);
                    }
                    else
                    {
                        throw new Asn1UnreachableExcpetion(ExceptionMessages.Unreachable);
                    }
                    long allowedIndex = Convert.ToInt64(o);
                    if (definedAllowedIndices.Contains(allowedIndex))
                    {
                        throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent +
                        " Duplicated indices.");
                    }
                    definedAllowedIndices.Add(allowedIndex);
                }
                //Get Choice.
                if (mi.IsDefined(typeof(Asn1ChoiceElement), true))
                {
                    if (mi.MemberType == MemberTypes.Field ||
                        mi.MemberType == MemberTypes.Property)
                    {
                        ChoiceMetaData metaData = new ChoiceMetaData(this, mi);
                        metaDataList.Add(metaData);
                    }
                    else
                    {
                        throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent
                            + " Asn1ChoiceElement property could only be used in properties or fields.");
                    }
                }
            }

            //Ensure the consistency of the definition.
            definedAllowedIndices.Sort();
            metaDataList = new List<ChoiceMetaData>(metaDataList.OrderBy(var => var.AttachedIndex));
            List<long?> indicesDefinedInChoices = metaDataList.ConvertAll(var => var.AttachedIndex);
            if (!definedAllowedIndices.SequenceEqual(indicesDefinedInChoices))
            {
                throw new Asn1UserDefinedTypeInconsistent(ExceptionMessages.UserDefinedTypeInconsistent +
                    " Stated Indices are different from the indices in choice elements' attributes.");
            }

            metaDatas = metaDataList.ToArray();
        }