Esempio n. 1
0
 private static void AppendValue(StringBuilder sb, Type type, CustomAttributeTypedArgument arg)
 {
     if (arg.ArgumentType == arg.ArgumentType.Module.universe.System_String)
     {
         sb.Append('"').Append(arg.Value).Append('"');
     }
     else if (arg.ArgumentType.IsArray)
     {
         Type   elementType = arg.ArgumentType.GetElementType();
         string elementTypeName;
         if (elementType.IsPrimitive ||
             elementType == type.Module.universe.System_Object ||
             elementType == type.Module.universe.System_String ||
             elementType == type.Module.universe.System_Type)
         {
             elementTypeName = elementType.Name;
         }
         else
         {
             elementTypeName = elementType.FullName;
         }
         sb.Append("new ").Append(elementTypeName).Append("[").Append(((Array)arg.Value).Length).Append("] { ");
         string sep = "";
         foreach (CustomAttributeTypedArgument elem in (CustomAttributeTypedArgument[])arg.Value)
         {
             sb.Append(sep);
             sep = ", ";
             AppendValue(sb, elementType, elem);
         }
         sb.Append(" }");
     }
     else
     {
         if (arg.ArgumentType != type || (type.IsEnum && !arg.Value.Equals(0)))
         {
             sb.Append('(');
             sb.Append(arg.ArgumentType.FullName);
             sb.Append(')');
         }
         sb.Append(arg.Value);
     }
 }
Esempio n. 2
0
        private static object RewrapArray(Type type, CustomAttributeTypedArgument arg)
        {
            IList <CustomAttributeTypedArgument> list = arg.Value as IList <CustomAttributeTypedArgument>;

            if (list != null)
            {
                Type     elementType = arg.ArgumentType.GetElementType();
                object[] arr         = new object[list.Count];
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = RewrapArray(elementType, list[i]);
                }
                if (type == type.Module.universe.System_Object)
                {
                    return(CustomAttributeBuilder.__MakeTypedArgument(arg.ArgumentType, arr));
                }
                return(arr);
            }
            else
            {
                return(arg.Value);
            }
        }
Esempio n. 3
0
        private static CustomAttributeTypedArgument ReadFixedArg(Module context, ByteReader br, Type type)
        {
            Universe u = context.universe;

            if (type == u.System_String)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadString()));
            }
            else if (type == u.System_Boolean)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadByte() != 0));
            }
            else if (type == u.System_Char)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadChar()));
            }
            else if (type == u.System_Single)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadSingle()));
            }
            else if (type == u.System_Double)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadDouble()));
            }
            else if (type == u.System_SByte)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadSByte()));
            }
            else if (type == u.System_Int16)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadInt16()));
            }
            else if (type == u.System_Int32)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadInt32()));
            }
            else if (type == u.System_Int64)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadInt64()));
            }
            else if (type == u.System_Byte)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadByte()));
            }
            else if (type == u.System_UInt16)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadUInt16()));
            }
            else if (type == u.System_UInt32)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadUInt32()));
            }
            else if (type == u.System_UInt64)
            {
                return(new CustomAttributeTypedArgument(type, br.ReadUInt64()));
            }
            else if (type == u.System_Type)
            {
                return(new CustomAttributeTypedArgument(type, ReadType(context, br)));
            }
            else if (type == u.System_Object)
            {
                return(ReadFixedArg(context, br, ReadFieldOrPropType(context, br)));
            }
            else if (type.IsArray)
            {
                int length = br.ReadInt32();
                if (length == -1)
                {
                    return(new CustomAttributeTypedArgument(type, null));
                }
                Type elementType = type.GetElementType();
                CustomAttributeTypedArgument[] array = new CustomAttributeTypedArgument[length];
                for (int i = 0; i < length; i++)
                {
                    array[i] = ReadFixedArg(context, br, elementType);
                }
                return(new CustomAttributeTypedArgument(type, array));
            }
            else if (type.IsEnum)
            {
                return(new CustomAttributeTypedArgument(type, ReadFixedArg(context, br, type.GetEnumUnderlyingTypeImpl()).Value));
            }
            else
            {
                throw new InvalidOperationException();
            }
        }