OpenOffice.org API 经常使用 any
类型,此类型是与其他环境能够识别的 Variant
类型相对应的类型。any
类型具有任意一个 UNO 类型的属性。any
类型尤其常用于一般 UNO 接口。
接口 | 返回 any 类型 | 接受 any 类型 | |
---|---|---|---|
XPropertySet | any getPropertyValue(string propertyName) | void setPropertyValue(any value) | |
XNameContainer | any getByName(string name) | void replaceByName(string name, any element) | void insertByName(string name, any element) |
XIndexContainer | any getByIndex(long index) | void replaceByIndex(long index, any element) | void insertByIndex(long index, any element) |
XEnumeration | any nextElement() | - |
any
类型还出现在 com.sun.star.beans.PropertyValue 结构中。
com.sun.star.beans.propertyValue
string Name
any Value
此 struct
有两个成员变量(Name
和 Value
),并且在 PropertyValue
结构集中普遍存在。在这些结构集中每个 PropertyValue
都是一个按名称和值来说明属性的“名称-值”对。如果需要设置此PropertyValue 结构的值,则必须指定一个 any 类型,而且如果是从 PropertyValue
中读取,必须能够解释所含有的 any
。如何实现取决于使用的语言。
在 Java 中,any
类型映射到 java.lang.Object
,但还存在一个特殊的 Java 类 com.sun.star.uno.Any
,它主要在普可 Object
不太明确时使用。有两个简单的经验规则需要遵守:
传入 any 值时,请始终传入 java.lang.Object
或 Java UNO 对象。
例如,如果使用 setPropertyValue()
设置在目标对象中具有无接口类型的属性,则必须传入新值的 java.lang.Object
。如果新值是 Java 中的原始类型,则使用此原始类型相应的 Object
类型:
xCellProps.setPropertyValue("CharWeight", new Double(200.0));
另一个示例是要用于 loadComponentFromURL
的 PropertyValue
结构:
com.sun.star.beans.PropertyValue aProperty = new com.sun.star.beans.PropertyValue(); aProperty.Name = "ReadOnly"; aProperty.Value = Boolean.TRUE;
收到一个 any 实例时,始终要使用 com.sun.star.uno.AnyConverter
来获取它的值。
需要注意一下 AnyConverter
。例如,如果要获得含有原始 Java 类型的属性,必须注意getPropertyValue()
返回的是含有原始类型(包在 any 值中)的 java.lang.Object
。com.sun.star.uno.AnyConverter
是此类对象的转换器。实际上它所能做的不仅仅是转换,您可以在 Java UNO 引用中找到它的规范。以下列表汇总了 AnyConverter
中的转换函数:
static java.lang.Object toArray(java.lang.Object object) static boolean toBoolean(java.lang.Object object) static byte toByte(java.lang.Object object) static char toChar(java.lang.Object object) static double toDouble(java.lang.Object object) static float toFloat(java.lang.Object object) static int toInt(java.lang.Object object) static long toLong(java.lang.Object object) static java.lang.Object toObject(Class clazz, java.lang.Object object) static java.lang.Object toObject(Type type, java.lang.Object object) static short toShort(java.lang.Object object) static java.lang.String toString(java.lang.Object object) static Type toType(java.lang.Object object) static int toUnsignedInt(java.lang.Object object) static long toUnsignedLong(java.lang.Object object) static short toUnsignedShort(java.lang.Object object)
其用法非常简单:
import com.sun.star.uno.AnyConverter; long cellColor = AnyConverter.toLong(xCellProps.getPropertyValue("CharColor"));
为了方便起见,对于接口类型,您可以直接使用 UnoRuntime.queryInterface()
,而无需先调用 AnyConverter.getObject()
:
import com.sun.star.uno.AnyConverter;import com.sun.star.uno.UnoRuntime; Object ranges = xSpreadsheet.getPropertyValue("NamedRanges"); XNamedRanges ranges1 = (XNamedRanges) UnoRuntime.queryInterface( XNamedRanges.class, AnyConverter.toObject(XNamedRanges.class, r)); XNamedRanges ranges2 = (XNamedRanges) UnoRuntime.queryInterface( XNamedRanges.class, r);
在 OpenOffice.org Basic 中,any 类型变为 Variant:
'{OpenOffice.org Basic Dim cellColor as Variant cellColor = oCellProps.CharColor
In C++, there are special operators for the any
type:在 C++ 中,有一些特定的运算符用于 any
类型:
//C++ has >>= and <<= for Any (the pointed brackets are always left) sal_Int32 cellColor; Any any; any = rCellProps->getPropertyValue(OUString::createFromAscii( "CharColor" )); // extract the value from any any >>= cellColor;