无法将Set设置为一组列表等对象。所以如果你有一个方法可以采取任何对象,如:
public void handler(Object any_var_including_a_set)
有没有办法动态迭代Set的内容而不知道该集合持有的数据类型?
答案 0 :(得分:1)
Apex中没有Object.getClass()
的概念;另一种方法是使用instanceof
和一组已知的类型。
下面修改handler
,使用JSON.serialize
,然后确定ofAnyType
是数组,对象还是其他原语。
假设一个数组(Apex中的Set
或List
),可以将其强制转换为List<Object>
。可以迭代这个以确定每个成员的instanceof
。
替代实现将使用ofAnyType instanceof Set<Object_Type_Here>
,但不是那么抽象。
public static void handler(Object ofAnyType)
{
String jsonString = JSON.serialize(ofAnyType);
System.debug(jsonString);
// if array, use List<Object>
if(jsonString.length() > 0 && jsonString.startsWith('[') && jsonString.endsWith(']'))
{
List<Object> mapped = (List<Object>)JSON.deserializeUntyped(jsonString);
// iterate over mapped, check type of each Object o within iteration
for(Object o : mapped)
{
if(o instanceof String)
{
System.debug((String)o);
}
}
}
// if object, use Map<String, Object>
else if(jsonString.length() > 0 && jsonString.startsWith('{') && jsonString.endsWith('}'))
{
Map<String, Object> mapped = (Map<String,Object>)JSON.deserializeUntyped(jsonString);
// iterate over mapped, check type of each Object o within iteration
for(Object o : mapped.values())
{
if(o instanceof String)
{
System.debug((String)o);
}
}
}
}
为了快速测试,我在handler
课程中保存了StackTesting
。您可以使用以下代码执行匿名Apex并查看结果。
Integer i = 42;
Set<String> strs = new Set<String>{'hello', 'world'};
Set<Object> objs = new Set<Object>{'hello', 2, new Account(Name = 'Sure')};
StackTesting.handler(i);
StackTesting.handler(strs);
StackTesting.handler(objs);
请注意,更强大的实现会在Apex中使用Pattern
,这将取代.startsWith
和.endsWith
以确定jsonString
是否为数组或对象