我认为这个问题可以使用反射(一种我不太确定的技术)进行分类。
我的代码正在接收一些在运行时已序列化为XML的代码对象。当我收到它并对其进行反序列化时,一个字段会让我感到麻烦。
有一个字段可以包含以下数据类的组合(为简洁起见而简化):
class KeyValuePairType
{
public string Key;
public string Value;
}
class KeyValueListPair
{
public string Key;
public string[] Value;
}
我将这些作为对象[]接收到我的代码中,我需要在运行时确定它包含的内容,以便我可以在需要的本地对象上调用接口 KeyValuePairType []和KeyValueListPair []作为参数,例如
public DoSomeWork(KeyValuePairType[] data1, KeyValueListPair[] data2)
我有以下案例可以应对:
object []包含:
我打电话的情况都没有 DoSomeWork(NULL,NULL);
仅限KeyValuePairType数组, 在这种情况下我打电话 DoSomeWork(KeyValuePairType [], 空);
仅限KeyValueListPair数组, 在这种情况下我打电话 DoSomework(NULL, KeyValueListPair []);
或每个的数组,在这种情况下我 调用DoSomework(KeyValuePairType [], KeyValueListPair []);
欢迎任何想法。
谢谢
事实证明,对象数组包含随机的离散对象序列。最初,我被引导相信它可能是一系列离散和这些对象的数组。
因为LINQ语句将涵盖所有可能性。
我能否对那些回答的人表示非常感谢。我已经为那些回答LINQ语句的人发布了+1。
答案 0 :(得分:5)
假设你有LINQ可用......
public void Foo(object[] values)
{
var pairs = values.OfType<KeyValuePairType>().ToArray();
var lists = values.OfType<KeyValueListPair>().ToArray();
pairs = pairs.Length == 0 ? null : pairs;
lists = lists.Length == 0 ? null : lists;
DoSomeWork(pairs, lists);
}
答案 1 :(得分:1)
您可以使用C#3中的LINQ执行此操作,如下所示:
void HandleThings(params object[] values) {
var pairTypes = values.OfType<KeyValuePairType>().ToArray();
var listPairs = values.OfType<KeyValueListPair>().ToArray();
DoSomeWork(pairTypes.Any() ? pairTypes : null, listPairs.Any() ? listPairs : null);
}
您可以将.Any()
替换为.Length > 0
,以简洁为代价,使其速度更快。
答案 2 :(得分:1)
这个怎么样:
object[] objects = GetObjects();
var pairs = objects.OfType<KeyValuePairType[]>().FirstOrDefault();
var lists = objects.OfType<KeyValueListPair[]>().FirstOrDefault();
DoSomeWork(pairs, lists);
答案 3 :(得分:0)
答案 4 :(得分:-2)
确保object []不为null且长度大于1后,您只需在数组中的对象上调用GetType即可。
objectArray[0].GetType().FullName
将返回
"Namespace.KeyValuePairType"
或
"Namespace.KeyValueListPair"