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