public static extern void New(TypeDescriptionReference **ppTDR, int /* enum typelib_TypeClass */ eTypeClass, /* uno.rtl.UString */ void *pTypeName);
static Type MapUnoType(TypeDescriptionReference *TD) { Type result; switch(TD->eTypeClass) { case TypeClass.VOID: result = typeof(void); break; case TypeClass.CHAR: result = typeof(char); break; case TypeClass.BOOLEAN: result = typeof(bool); break; case TypeClass.BYTE: result = typeof(byte); break; case TypeClass.SHORT: result = typeof(short); break; case TypeClass.UNSIGNED_SHORT: result = typeof(ushort); break; case TypeClass.LONG: result = typeof(int); break; case TypeClass.UNSIGNED_LONG: result = typeof(uint); break; case TypeClass.HYPER: result = typeof(long); break; case TypeClass.UNSIGNED_HYPER: result = typeof(ulong); break; case TypeClass.FLOAT: result = typeof(float); break; case TypeClass.DOUBLE: result = typeof(double); break; case TypeClass.STRING: result = typeof(string); break; case TypeClass.TYPE: result = typeof(Type); break; case TypeClass.ANY: result = typeof(uno.Any); break; case TypeClass.ENUM: case TypeClass.STRUCT: case TypeClass.EXCEPTION: result = Bridge.LoadCliType(TD->pTypeName); break; case TypeClass.INTERFACE: // special handling for XInterface, since it does not exist in cli. if (UString.UStringToString(TD->pTypeName) == "com.sun.star.uno.XInterface") result = typeof(object); else result = Bridge.LoadCliType(TD->pTypeName); break; case TypeClass.SEQUENCE: { // FIXME do something with TD here? TypeDescriptionReference *elementTDRef = ((IndirectTypeDescription *)TD)->pType; switch (elementTDRef->eTypeClass) { case TypeClass.CHAR: result = Type.GetType("System.Char[]"); break; case TypeClass.BOOLEAN: result = Type.GetType("System.Boolean[]"); break; case TypeClass.BYTE: result = Type.GetType("System.Byte[]"); break; case TypeClass.SHORT: result = Type.GetType("System.Int16[]"); break; case TypeClass.UNSIGNED_SHORT: result = Type.GetType("System.UInt16[]"); break; case TypeClass.LONG: result = Type.GetType("System.Int32[]"); break; case TypeClass.UNSIGNED_LONG: result = Type.GetType("System.UInt32[]"); break; case TypeClass.HYPER: result = Type.GetType("System.Int64[]"); break; case TypeClass.UNSIGNED_HYPER: result = Type.GetType("System.UInt64[]"); break; case TypeClass.FLOAT: result = Type.GetType("System.Single[]"); break; case TypeClass.DOUBLE: result = Type.GetType("System.Double[]"); break; case TypeClass.STRING: result = Type.GetType("System.String[]"); break; case TypeClass.TYPE: result = Type.GetType("System.Type[]"); break; case TypeClass.ANY: case TypeClass.ENUM: case TypeClass.EXCEPTION: case TypeClass.STRUCT: case TypeClass.INTERFACE: case TypeClass.SEQUENCE: result = Bridge.LoadCliType(TD->pTypeName); break; default: // FIXME can't happen result = null; break; } break; } default: // FIXME can't happen result = null; break; } return result; }