Пример #1
0
        public static string FormatEnumValue(TypeDefinitionData enumType, object value)
        {
            var unqualifiedName = enumType.GetDisplayName(fullyQualify: false);

            foreach (ConstantData constant in enumType.GetMembers())
            {
                if (Object.Equals(constant.Value, value))
                {
                    return(unqualifiedName + "." + constant.Name);
                }
            }

            if (enumType.IsFlagsEnum)
            {
                var sb        = new StringBuilder();
                var longValue = Convert.ToUInt64(value);
                foreach (ConstantData constant in enumType.GetMembers())
                {
                    var longFlag = Convert.ToUInt64(constant.Value);
                    if ((longValue & longFlag) == longFlag)
                    {
                        longValue &= ~longFlag;

                        if (sb.Length != 0)
                        {
                            sb.Append(" | ");
                        }

                        sb.AppendFormat("{0}.{1}", unqualifiedName, constant.Name);

                        if (longValue == 0)
                        {
                            return(sb.ToString());
                        }
                    }
                }
            }

            var rawValue = (ulong)value;

            return(string.Format("({0}){1}", unqualifiedName, rawValue));
        }
        private static bool IsMemberKindChangeAllowed(MemberDataBase oldMember, TypeDefinitionData newType, AssemblyFamily newAssemblyFamily)
        {
            if (oldMember.MetadataItemKind == MetadataItemKinds.Constant ||
                (oldMember.MetadataItemKind == MetadataItemKinds.Field && ((FieldData)oldMember).IsReadOnly) ||
                (oldMember.MetadataItemKind == MetadataItemKinds.Property && oldMember.CanBeOverridden == false))
            {
                var oldTypedMemer    = (TypedMemberDataBase)oldMember;
                var candidateMembers = newType.GetMembers(oldMember.Name).Where(m =>
                                                                                (
                                                                                    m.MetadataItemKind == MetadataItemKinds.Constant ||
                                                                                    m.MetadataItemKind == MetadataItemKinds.Field ||
                                                                                    m.MetadataItemKind == MetadataItemKinds.Property
                                                                                ) &&
                                                                                oldTypedMemer.Accessibility <= m.Accessibility &&
                                                                                m.IsInstance == oldMember.IsInstance &&
                                                                                oldTypedMemer.Type.IsEquivalentToNew(((ITypedItem)m).Type, newAssemblyFamily)
                                                                                ).ToList();

                if (candidateMembers.Count == 0)
                {
                    return(false);
                }

                Debug.Assert(candidateMembers.Count == 1, "There should only be one member with the same name.");

                var newMember = candidateMembers[0];
                if (oldMember.CanRead() && newMember.CanRead() == false)
                {
                    return(false);
                }

                if (oldMember.CanWrite() && newMember.CanWrite() == false)
                {
                    return(false);
                }

                var newProperty = newMember as PropertyData;
                if (newProperty != null && newProperty.GetMethodAccessibility < oldMember.Accessibility)
                {
                    return(false);
                }

                return(true);
            }

            return(false);
        }