private object ResolveArgumentValue(CustomAttributeArgument argument, Type type)
{
var typeCode = argument.ArgumentType.TypeCode;
var valuePtr = argument.GetArgumentValue();
// If its an enum type
if (argument.ArgumentType.ParentType.Handle == EnumTypePtr.Handle)
{
typeCode = argument.ArgumentType.ElementType.TypeCode;
}
switch (typeCode)
{
// 1 byte
case TypeCode.Boolean:
return((bool)(Intrinsic.Load8(valuePtr) != 0));
case TypeCode.U1:
return((byte)Intrinsic.Load8(valuePtr));
case TypeCode.I1:
return((sbyte)Intrinsic.Load8(valuePtr));
// 2 bytes
case TypeCode.Char:
return((char)Intrinsic.Load16(valuePtr));
case TypeCode.U2:
return((ushort)Intrinsic.Load16(valuePtr));
case TypeCode.I2:
return((short)Intrinsic.Load16(valuePtr));
// 4 bytes
case TypeCode.U4:
return((uint)Intrinsic.Load32(valuePtr));
case TypeCode.I4:
return((int)Intrinsic.Load32(valuePtr));
case TypeCode.R4:
return(Intrinsic.LoadR4(valuePtr));
// 8 bytes
case TypeCode.U8:
return((ulong)Intrinsic.Load64(valuePtr));
case TypeCode.I8:
return((long)Intrinsic.Load64(valuePtr));
case TypeCode.R8:
return(Intrinsic.LoadR8(valuePtr));
// SZArray
case TypeCode.SZArray:
return(ResolveArrayValue(argument, type));
// String
case TypeCode.String:
return((string)Intrinsic.GetObjectFromAddress(valuePtr));
default:
if (type.FullName == "System.Type")
{
// Get the argument type
var argTypeHandle = new RuntimeTypeHandle(argument.ArgumentType.Ptr);
return(Type.GetTypeFromHandle(argTypeHandle));
}
throw new ArgumentException();
}
}